2012-01-17 35 views
8

Cố gắng chuyển hướng đầu ra của một tiến trình con tới một tệp.subprocess.Popen() IO chuyển hướng

server.py:

while 1: 
    print "Count " + str(count) 
    sys.stdout.flush() 
    count = count + 1 
    time.sleep(1) 

Laucher:

cmd = './server.py >temp.txt' 
args = shlex.split(cmd) 
server = subprocess.Popen(args) 

Sản lượng xuất hiện trên màn hình, temp.txt vẫn trống. Tôi đang làm gì sai?

Là nền tôi đang cố gắng nắm bắt đầu ra của một chương trình đã được viết.

tôi không thể sử dụng:

server = subprocess.Popen(
       [exe_name], 
       stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

như chương trình có thể không tuôn ra. Thay vào đó, tôi sẽ chuyển hướng đầu ra thông qua một năm mươi. Điều này làm việc tốt nếu tôi tự khởi chạy server.py nhưng rõ ràng là không nếu tôi Popen() gây ra chuyển hướng không hoạt động. ps -aux cho thấy rằng server.py đã được khởi chạy chính xác.

Trả lời

7

Altenatively, bạn có thể sử dụng tham số stdout với một đối tượng file:

with open('temp.txt', 'w') as output: 
    server = subprocess.Popen('./server.py', stdout=output) 
    server.communicate() 

Như đã giải thích trong documentation:

stdin, stdout và stderr xác định đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và các tập tin lỗi chuẩn của chương trình được thực hiện tương ứng. Các giá trị hợp lệ là PIPE, một bộ mô tả tệp hiện có (một số nguyên dương), một đối tượng tệp hiện có và Không có.

+0

Điều đó có hiệu quả. Giao tiếp sẽ chặn người đọc cho đến khi máy chủ kết thúc nhưng bây giờ tôi có thể chuyển hướng tôi có thể gửi đầu ra của máy chủ đến nămo. –

+1

không cần phải gọi '.communicate()' tại đây. 'subprocess.check_call ('command', stdout = file)' hoạt động. – jfs

4

Chuyển hướng đầu ra bằng ">" là một tính năng của các trình bao - theo mặc định, subprocess.Popen không khởi tạo một trình bao. Điều này sẽ làm việc:

server = subprocess.Popen(args, shell=True) 
+0

Sử dụng 'shell = True' không phải là cách ưa thích, trừ khi cần thiết (và ở đây không phải) – wim

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