2011-11-10 27 views
14

Tôi gặp sự cố khi sử dụng subprocess.Popen hoặc subprocess.call khi tôi sử dụng chúng để thực thi dòng lệnh tạo ra nhiều đầu ra, các tập lệnh python bị treo, nhưng kỳ lạ sau khi chờ đợi một lúc, trong khi kịch bản đang ở trạng thái treo, tôi thấy rằng công việc được chỉ huy bởi dòng cmd đã được thực hiện và chỉ có kịch bản được treo ra.Python: subprocess.Popen và subprocess.call treo

subprocess.call(cmd, shell = True) 
#OR 
subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True) 
# HANGS HERE 
print "show something after subprocess" 

Lưu ý rằng bản in cuối cùng chưa bao giờ được thực thi, nhưng thực ra cmd đã được thực thi.

Lưu ý rằng cmd có liên quan đến cổng nối tiếp, vì vậy khi tôi cắm cáp nối tiếp, mọi thứ trở nên tốt và bản in cuối cùng được thực hiện. Nhưng khi tôi sử dụng thiết bị đầu cuối tất cả mọi thứ là tốt ngay cả khi nối tiếp được cắm vào, nó chỉ xảy ra với kịch bản python.

Thanks a lot

Trả lời

12

Theo tài liệu python, subprocess.call chạy lệnh và chờ đợi cho nó để hoàn thành, do đó, nó tương đương với subprocess.Popen Tiếp theo Popen.wait.

Tuy nhiên, tài liệu phương pháp Popen.wait phương pháp cảnh báo rõ ràng về sự cố tràn bộ đệm và đề xuất sử dụng Popen.communicate thay thế. Do đó, giải pháp bạn đang tìm kiếm nên có cái gì đó như:

import subprocess 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) 
stdout, stderr = process.communicate() 
print "show something after subprocess" 
+1

Không có vấn đề gì khi sử dụng 'subprocess.call' nếu bạn không sử dụng' subprocess.PIPE', OP không phải là. – interjay

+1

Nó không giải thích tại sao đầu ra của câu lệnh 'print' không được hiển thị trong phụ huynh. 'Popen()' không chờ đợi cho trẻ ngay cả khi quá trình con bị chặn trong một nỗ lực để ghi vào đường ống với bộ đệm đầy đủ. – jfs

2

Tôi không hiểu tại sao dòng đầu tiên của bạn không hoạt động - như không có stdin/stdout/stderr chuyển hướng, không có nhu cầu để chặn.

Điều thứ hai là vụ phải chặn nếu quá trình

  1. hy vọng dữ liệu thông qua stdin hoặc
  2. gửi dữ liệu hơn để thiết bị xuất chuẩn hơn là một ống có thể giữ wothout được đọc.

Nhưng khi quy trình con của bạn chấm dứt chính xác, tôi cũng không thể thấy lý do chặn. Bạn có chắc chắn rằng nó thực sự chấm dứt?

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