Tôi đang gặp một số khó khăn khi nhận được kết quả đầu ra từ một đường ống phụ xử lý. Tôi đang khởi chạy một số mã của bên thứ ba thông qua nó, để trích xuất đầu ra của nhật ký. Cho đến khi cập nhật gần đây mã của bên thứ ba, mọi thứ đều hoạt động tốt. Sau khi cập nhật, python đã bắt đầu chặn vô thời hạn và không thực sự hiển thị bất kỳ đầu ra nào. Tôi có thể khởi chạy ứng dụng của bên thứ ba một cách thủ công và xem kết quả đầu ra.Đầu ra con của Python trên cửa sổ?
Một phiên bản cơ bản của mã Tôi đang sử dụng:
import subprocess, time
from threading import Thread
def enqueue_output(out):
print "Hello from enqueue_output"
for line in iter(out.readline,''):
line = line.rstrip("\r\n")
print "Got %s" % line
out.close()
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, bufsize=1)
thread = Thread(target=enqueue_output, args=(proc.stdout,))
thread.daemon = True
thread.start()
time.sleep(30)
này hoạt động hoàn hảo nếu tôi thay third_party.exe cho kịch bản này:
import time, sys
while True:
print "Test"
sys.stdout.flush()
time.sleep(1)
Vì vậy, tôi không rõ ràng như kỳ diệu cần phải được thực hiện để làm việc này với lệnh gốc.
Đây là tất cả các biến thể của dòng subprocess.Popen tôi đã cố gắng nhưng không thành công:
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, bufsize=0)
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, shell=True)
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, creationflags=subprocess.CREATE_NEW_CONSOLE)
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, startupinfo=si)
Sửa 1: tôi không thể thực sự sử dụng .communicate() trong trường hợp này. Ứng dụng tôi đang khởi chạy vẫn chạy trong một thời gian dài (vài ngày đến vài tuần). Cách duy nhất tôi thực sự có thể kiểm tra .communicate() sẽ là để giết các ứng dụng ngay sau khi nó ra mắt, mà tôi không cảm thấy sẽ cho tôi kết quả hợp lệ.
Ngay cả những phiên bản không-ren của điều này không:
import subprocess, time
from threading import Thread
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print "App started, reading output..."
for line in iter(proc.stdout.readline,''):
line = line.rstrip("\r\n")
print "Got: %s" % line
Chỉnh sửa 2: Nhờ JDI, các công việc sau okay:
import tempfile, time, subprocess
w = "test.txt"
f = open("test.txt","a")
p = subprocess.Popen("third_party.exe", shell=True, stdout=f,
stderr=subprocess.STDOUT, bufsize=0)
time.sleep(30)
with open("test.txt", 'r') as r:
for line in r:
print line
f.close()
Có thể chương trình bên thứ ba của bạn đã chuyển sang viết thành stderr không? – jdi
Dường như không phải như vậy. Nếu tôi chặn stderr thay vào đó, điều tương tự xảy ra (mặc dù, tôi thấy đầu ra của ứng dụng trên giao diện điều khiển, nhưng nó chỉ là in ấn, nó không đi qua Python). – devicenull
Có vẻ như ứng dụng đã ngừng sử dụng đầu ra tiêu chuẩn và đang ghi trực tiếp vào bảng điều khiển. Nếu vậy, bạn không thể làm được gì nhiều về điều này. Bạn có thể kiểm tra với nhà cung cấp ứng dụng không? –