2009-07-26 29 views
20

Tôi đang cố gắng đọc từ một quy trình tạo ra đầu ra dài và tốn thời gian. Tuy nhiên, tôi muốn bắt đầu ra là như và khi nó được tạo ra. Nhưng sử dụng giống như sau dường như là bộ đệm đầu ra của lệnh, vì vậy tôi kết thúc nhận được dòng đầu ra tất cả cùng một lúc:Đọc không đọc được từ quy trình sử dụng tiến trình con trong Python

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0) 
    for line in p.stdout: 
     print line 

tôi đang cố gắng này trên hệ điều hành MacOS 10,5

+0

trùng lặp: http://stackoverflow.com/questions/874815/how-do-i-get-real-time-information-back-from -a-subprocess-popen-in-python-2-5, http://stackoverflow.com/questions/527197/intercepting-stdout-of-a-subprocess-while-it-is-running –

Trả lời

28

Các iterator tập tin được thực hiện một số đệm nội bộ on its own. Hãy thử điều này:

line = p.stdout.readline() 
while line: 
    print line 
    line = p.stdout.readline() 
+0

Hoạt động tốt. Cảm ơn! – Abhi

+0

Cảm ơn bạn, bạn đã tiết kiệm cho tôi một số kéo tóc. – haridsv

6

Thông thường, mọi chương trình sẽ thực hiện thêm các kênh đầu vào và/hoặc đầu ra hơn mong muốn của bạn!

Vì mục đích "lừa đảo vì mục đích tốt", hãy sử dụng pexpect - nó hoạt động tốt trên máy Mac (cuộc sống khó hơn trên Windows, mặc dù có những giải pháp có thể giúp ngay cả ở đó - may mắn thay chúng tôi không cần ở trên những người khi bạn sử dụng máy Mac thay thế).

3

Đây thực sự là một lỗi đó là cố định bằng Python 2.6: http://bugs.python.org/issue3907

+4

Trên python 2,7 'cho dòng trong p.stdout' vẫn trì hoãn đầu ra của nó trong khi' cho dòng trong vòng lặp (p.stdout.readline, b '') 'hoạt động như mong đợi (nó tạo ra các dòng ngay khi chúng có sẵn). – jfs

+0

Xin lỗi, 2.x sẽ không sử dụng thư viện io mới theo mặc định, vì nhận xét cuối cùng về báo cáo lỗi cho biết; Bạn sẽ phải làm một cái gì đó như 'cho dòng trong io.open (p.stdin.fileno())'. – Ari

+1

@Ari: Đó có phải là 'cho dòng trong io.open (p.stdout.fileno())'? –

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