Trong tập lệnh, tôi muốn chạy .exe với một số tham số dòng lệnh dưới dạng "-a", sau đóLàm thế nào để chuyển hướng đầu ra của .exe vào một tệp trong python?
chuyển hướng đầu ra tiêu chuẩn của chương trình sang tệp?
Tôi làm cách nào để triển khai?
Trong tập lệnh, tôi muốn chạy .exe với một số tham số dòng lệnh dưới dạng "-a", sau đóLàm thế nào để chuyển hướng đầu ra của .exe vào một tệp trong python?
chuyển hướng đầu ra tiêu chuẩn của chương trình sang tệp?
Tôi làm cách nào để triển khai?
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)
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.
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
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
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__
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ách sử dụng quy trình con đó? – Kim
Xem http://docs.python.org/library/subprocess.html#replacing-os-system. –
Đ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