2013-07-15 27 views
30

Tôi muốn đường ống đầu ra của ps -ef đến dòng python theo dòng.Làm thế nào để đầu vào đường ống vào dòng python theo dòng từ chương trình Linux?

Các kịch bản tôi đang sử dụng là này (first.py) -

#! /usr/bin/python 

import sys 

for line in sys.argv: 
    print line 

Thật không may, "dòng" được chia thành các từ cách nhau bởi khoảng trắng. Vì vậy, ví dụ, nếu tôi làm

echo "days go by and still" | xargs first.py 

đầu ra tôi nhận được là

./first.py 
days 
go 
by 
and 
still 

Làm thế nào để viết kịch bản như vậy mà đầu ra là

./first.py 
days go by and still 

?

Trả lời

61

Tôi không hiểu tại sao bạn muốn sử dụng đối số dòng lệnh thay vì chỉ đọc từ đầu vào tiêu chuẩn. Python có một thành ngữ đơn giản cho iterating trên dòng ở stdin:

import sys 

for line in sys.stdin: 
    sys.stdout.write(line) 

sử dụng ví dụ của tôi:

$ echo -e "first line\nsecond line" | python python_iterate_stdin.py 
first line 
second line 

ví dụ sử dụng của bạn:

$ echo "days go by and still" | python python_iterate_stdin.py 
days go by and still 
+0

Cảm ơn câu trả lời này. Tôi có thể đánh dấu câu trả lời này là câu trả lời chính xác, nhưng câu trả lời khác cũng đúng và được đăng đầu tiên. – CodeBlue

+1

Chỉ cần làm rõ: mục tiêu của bạn là đọc đầu ra tiêu chuẩn của một dòng chương trình phù hợp với chương trình Python của bạn. Bạn đang sử dụng dòng lệnh, bạn đề xuất sử dụng một đường ống để chuyển đầu ra tiêu chuẩn từ chương trình đầu tiên sang chương trình thứ hai của bạn (có ý nghĩa). Và sau đó, thay vì chỉ đọc từ đầu vào tiêu chuẩn trong chương trình Python, bạn muốn đưa chương trình thứ ba vào ngăn xếp thực hiện phép chuyển đổi từ stdin sang đối số dòng lệnh và có thể gọi chương trình Python của bạn nhiều lần và phân đoạn đầu vào (bạn biết 'xargs' hoạt động như thế nào?)? –

+0

Không, tôi không biết cách xarg hoạt động như thế nào. – CodeBlue

1

gì bạn muốn là popen, mà làm cho nó có thể đọc trực tiếp đầu ra của lệnh như bạn sẽ đọc một tệp:

import os 
with os.popen('ps -ef') as pse: 
    for line in pse: 
     print line 
     # presumably parse line now 

Lưu ý rằng, nếu bạn muốn phân tích cú pháp phức tạp hơn, bạn sẽ phải tìm hiểu tài liệu của subprocess.Popen.

Các vấn đề liên quan