2009-05-19 49 views

Trả lời

23

Bạn có thể chuyển hướng trực tiếp vào một tập tin sử dụng tiến trình con.

import subprocess 
with open('output.txt', 'w') as output_f: 
    p = subprocess.Popen('Text/to/execute with-arg', 
         stdout=output_f, 
         stderr=output_f) 
7

Dễ nhất là os.system("the.exe -a >thefile.txt"), nhưng có nhiều cách khác, ví dụ với mô-đun subprocess trong thư viện chuẩn.

+0

cách sử dụng quy trình con đó? – Kim

+0

Xem http://docs.python.org/library/subprocess.html#replacing-os-system. –

+3

Điều đáng ghi nhớ là biểu tượng ống khác nhau giữa các hệ điều hành khi cố gắng sử dụng os.system để chuyển hướng ... – mavnn

3

Bạn có thể làm điều gì đó như thế này ví dụ: đọc đầu ra của ls -l (hoặc bất kỳ lệnh khác)

p = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE) 
print p.stdout.read() # or put it in a file 

bạn có thể làm điều tương tự cho stderr/stdin

nhưng khi Alex đề cập nếu bạn chỉ muốn nó trong một tập tin, chỉ cần chuyển hướng cmd xuất ra một tệp

+0

Nếu đó là một quá trình chạy dài, hãy lưu ý rằng stdout.read() đang chặn. Bạn sẽ muốn chạy tiến trình con trên một luồng khác nếu kịch bản sẽ tiếp tục làm bất cứ điều gì khác hoặc trả lời đầu ra 'sống'. – mavnn

0

Nếu bạn chỉ muốn chạy tệp thi hành và chờ kết quả, giải pháp của Anurag có lẽ là tốt nhất. Tôi cần trả lời từng dòng đầu ra khi nó đến, và tìm thấy các công việc sau đây:

1) Tạo một đối tượng với phương thức ghi (văn bản). Chuyển hướng stdout sang nó (sys.stdout = obj). Trong phương pháp ghi của bạn, đối phó với đầu ra khi nó đến.

2) Chạy một phương pháp trong một thread riêng biệt với một cái gì đó giống như đoạn mã sau:

p = subprocess.Popen('Text/to/execute with-arg', stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, shell=False) 
    while p.poll() is None: 
     print p.stdout.readline().strip() 

Bởi vì bạn đã chuyển hướng stdout, PIPE sẽ gửi đầu ra cho dòng phương pháp ghi của bạn bằng cách dòng. Nếu bạn không chắc chắn bạn sẽ nhận được ngắt dòng, đọc (số tiền) hoạt động quá, tôi tin.

3) Hãy nhớ để chuyển hướng stdout trở lại mặc định: sys.stdout = __sys.stdout__

0

Mặc dù tiêu đề (.exe) có vẻ như đó là sự cố trên Windows. Tôi đã phải chia sẻ rằng câu trả lời được chấp nhận (subprocess.Popen() với stdout/stderr đối số) đã không làm việc cho tôi trên Mac OS X (10.8) với python 2.7.

Tôi đã phải sử dụng subprocess.check_output() (python 2.7 trở lên) để làm cho nó hoạt động. Ví dụ:

import subprocess 

cmd = 'ls -l' 
out = subprocess.check_output(cmd, shell=True) 
with open('my.log', 'w') as f: 
    f.writelines(out) 
    f.close() 

Lưu ý rằng giải pháp này ghi tất cả đầu ra tích lũy khi chương trình kết thúc. Nếu bạn muốn theo dõi tệp nhật ký trong khi chạy. Bạn có thể muốn thử cái gì khác. Trong trường hợp của riêng tôi, tôi chỉ quan tâm đến kết quả cuối cùng.

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