2013-01-21 28 views
6

Tôi đang cố gắng để có được đầu ra của kịch bản khác, sử dụng Python của subprocess.Popen thích sauPython Popen(). Stdout.read() treo

process = Popen(command, stdout=PIPE, shell=True) 
exitcode = process.wait() 
output = process.stdout.read() # hangs here 

Nó treo ở dòng thứ ba, chỉ khi tôi chạy nó như là một kịch bản python và tôi không thể tái tạo nó trong trình bao python.

Tập lệnh khác chỉ in một vài từ và tôi giả định rằng đó không phải là vấn đề về bộ đệm.

Có ai có ý tưởng về những gì tôi đang làm sai ở đây không?

+0

Và nếu bạn chạy lệnh trong 'lệnh' theo cách thủ công, nó sẽ tạo đầu ra? –

Trả lời

0

Bạn có thể muốn sử dụng .communicate() thay vì .wait() cộng .read(). Lưu ý các cảnh báo về wait() trên trang subprocess tài liệu:

Cảnh báo này sẽ bế tắc khi sử dụng stdout=PIPE và/hoặc stderr=PIPE và quá trình con tạo ra đủ sản lượng để một ống như vậy mà nó khối chờ đợi bộ đệm ống OS để chấp nhận nhiều dữ liệu hơn. Sử dụng communicate() để tránh điều đó.

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait

+0

Cảm ơn câu trả lời. Tôi chỉ nhận ra rằng tôi đã đọc một phần của tài liệu .. Những gì tôi đã làm là lấy thời gian thực stdout trong một 'while process.poll() là None:' loop trong khi kịch bản đang chạy, và đoạn mã trên là một tước phiên bản. Nhưng tôi đoán nó đã bị treo vì một vấn đề bế tắc tương tự ... – lyomi

0

read() chờ EOF trước khi trở về.

Bạn có thể:

  • chờ đợi cho tiến trình con phải chết, sau đó đọc() sẽ trở lại.
  • sử dụng readline() nếu đầu ra của bạn bị chia thành các dòng (sẽ vẫn treo nếu không có dòng đầu ra).
  • sử dụng os.read (F, N) trả về tối đa N byte từ F, nhưng sẽ vẫn chặn nếu đường ống trống (trừ khi O_NONBLOCK được đặt trên fd).