Tôi muốn chạy tập lệnh Python (hoặc bất kỳ tệp thực thi nào theo cách này) từ tập lệnh Python vàthời gian thựcNhận đầu ra. Tôi đã làm theo nhiều hướng dẫn và mã hiện tại của tôi trông như thế này:
nhập khẩu quy trình con
với open("test2", "w") là f:
f.write("""nhập thời gian
in('bắt đầu')
thời gian.ngủ(5)
in('xong')""")
tiến trình = subprocess.Popen(['python3', "test2"], stdout=subprocess.PIPE)
while True:
đầu ra = process.stdout.readline()
nếu đầu ra == '' và process.poll() không phải là Không có:
break
nếu đầu ra:
in(output.strip())
rc = tiến trình.poll()
Để rõ ràng, cái đầu tiên chỉ tạo tệp sẽ được chạy.
Có hai vấn đề với mã này:
Nó không cung cấp đầu ra trong thời gian thực. Nó đợi cho đến khi quá trình hoàn tất.
Khi quá trình hoàn tất, nó không kết thúc vòng lặp.
Mọi trợ giúp đều rất được hoan nghênh.
EDIT: Cảm ơn @JohnAnderson đã khắc phục sự cố đầu tiên: thay đổi nếu đầu ra == '' và process.poll() không phải là Không có:
Thay thế bằng nếu đầu ra == b '' và process.poll() không phải là Không có:
Đêm qua tôi bắt đầu sử dụng đường ống để thực hiện việc này:
hệ điều hành nhập khẩu
nhập khẩu quy trình con
với open("test2", "w") là f:
f.write("""nhập thời gian
in('bắt đầu')
thời gian.ngủ(2)
in('xong')""")
(readend, writeend) = os.pipe()
p = subprocess.Popen(['python3', '-u', 'test2'], stdout=writeend, bufsize=0)
still_open = Đúng
đầu ra = ""
out_buf = os.read(readend, 1).decode()
trong khi đầu ra_buf:
in(output_buf, end="")
đầu ra += đầu ra_buf
nếu still_open và p.poll() không phải là Không có:
os.close(viết cuối)
still_open = Sai
out_buf = os.read(readend, 1).decode()
Buộc đệm hình ảnh và đọc từng ký tự một (để đảm bảo chúng tôi không chặn việc ghi từ quy trình đã lấp đầy bộ đệm), đóng mặt ghi khi quá trình hoàn tất để đảm bảo quá trình đọc bắt được EOF chính xác. Đã xem subprocess
Hóa ra điều này hơi quá mức cần thiết. sử dụng ĐƯỜNG ỐNG
Bạn có thể nhận hầu hết chúng miễn phí, tôi đã kết thúc với cái này có vẻ hoạt động tốt (gọi read nhiều lần nếu cần thiết để giữ cho đường ống thông suốt) Thế là xong và giả sử quá trình hoàn tất, bạn không phải lo lắng về bỏ phiếu và/hoặc đảm bảo đầu ghi của đường ống là Đóng để phát hiện chính xác EOF và thoát khỏi vòng lặp:
p = subprocess.Popen(['python3', '-u', 'test2'],
stdout=subprocess.PIPE, bufsize=1,
Universal_newlines=Đúng)
đầu ra = ""
đầu ra_buf = p.stdout.readline()
trong khi đầu ra_buf:
in(output_buf, end="")
đầu ra += đầu ra_buf
đầu ra_buf = p.stdout.readline()
Đây không hẳn là "thời gian thực" vì về cơ bản nó được lưu vào bộ đệm.
Lưu ý: Tôi có -u
đối với lệnh gọi Python của bạn, vì bạn cũng cần đảm bảo rằng quá trình đệm của quá trình gọi không bị cản trở.
Tôi là một lập trình viên xuất sắc, rất giỏi!