2011-11-02 28 views
7

Tôi có một công việc chạy khá dài, chạy trong vài phút và sau đó được khởi động lại. Tác vụ đưa ra các thông tin khác nhau mà tôi chụp như sau:Làm thế nào tôi có thể nắm bắt đầu ra và hiển thị nó cùng một lúc với Python?

output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate() 

Điều này là, tôi sẽ chỉ nhận được toàn bộ đầu ra tại một thời điểm. Tôi muốn hiển thị đầu ra như là chương trình được gửi nó để stdout, trong khi vẫn đẩy nó trở lại trong một bộ đệm (tôi cần phải kiểm tra đầu ra cho sự hiện diện của một số dây). Trong Ruby Tôi sẽ làm điều đó như thế này:

IO.popen(cmd) do |io| 
    io.each_line do |line| 
    puts line 
    buffer << line 
    end 
end 

Trả lời

5

Bạn có thể thử một cái gì đó như thế này:

cmd = ["./my_program.sh"] 
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE) # launch the process 
while p.poll() is None:   # check if the process is still alive 
    out = p.stdout.readline() # if it is still alive, grab the output 
    do_something_with(out)  # do what you want with it 
3

Bạn có thể đọc nó một dòng tại một thời điểm:

from subprocess import Popen, PIPE 

p = Popen('grep -ir graph .', stdout=PIPE) 
while not p.returncode: 
    s = p.stdout.readline() 
    print s 
    p.poll() 

Bằng cách này , bạn chỉ chặn thời gian cần thiết để xử lý để xuất một dòng.

+0

Vì bạn không chỉ định kích thước bộ đệm, bộ đệm 4KB sẽ được thêm vào giữa hai quy trình, vì vậy chúng thường không chặn lẫn nhau. –

-1

Bạn có thể sử dụng lệnh "tee". Nó thực hiện chính xác những gì bạn cần từ nó.
http://www.computerhope.com/unix/utee.htm

+0

Có, nhưng tôi cần xử lý bộ đệm bằng Python, để biết tôi có nên khởi động lại tác vụ không. – Geo

+0

OP hỏi về việc giám sát quá trình mà họ đã khởi chạy bằng cách sử dụng popen từ bên trong mã Python để điều này không hữu ích. – cowbert

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