2015-07-06 19 views
5

Tôi có một tệp thực thi chấp nhận chuỗi và xuất ra một chuỗi khác. Bây giờ tôi cần phải cho một tập tin vào nó như là đầu vào và ghi đầu ra vào một tập tin khác. Lệnh tiêu chuẩn cho điều đó giống như sau executable_path <input> output. Bây giờ tôi quấn nó trong python. Nhưng tôi gặp lỗi.Lệnh gọi tiến trình con Python với dấu lớn hơn (>) không hoạt động

cmd = [executable_path , '<', 'tmp/input.txt', '>', 
      'tmp/output.txt'] 
    p = subprocess.Popen(cmd) 
    p.communicate() 

invalid argument: <

Tôi cũng cố gắng tham gia các đối số cmd:

cmd = [executable_path, ' '.join(['<', 'tmp/input.txt', '>', 
     'tmp/output.txt'])] 

invalid argument: < tmp/input.txt > tmp/output.txt

Đi qua các lệnh như chuỗi không làm việc một trong hai.

p = subprocess.Popen(' '.join(cmd)) 

OSError: [Errno 2] No such file or directory

tôi thiếu gì ở đây?

Trả lời

3

subprocess.Popen() có ba thông số để dễ dàng chuyển hướng: stdin, stdoutstderr. Theo mặc định, subprocess giữ lại các bộ mô tả tập tin của cá thể Python của bạn.

with open('tmp/input.txt', 'rb', 0) as in_stream, \ 
    open('tmp/output.txt', 'wb', 0) as out_stream: 
    subprocess.Popen([executable_path], stdin=in_stream, stdout=out_stream) 

cũng giống như lệnh shell executable_path <tmp/input.txt> tmp/output.txt.

Đối số cho open() là tên tệp, chế độ và bộ đệm. "rb" có nghĩa là "đọc dữ liệu nhị phân", "wb" có nghĩa là "(trên) ghi dữ liệu nhị phân", "ab" có nghĩa là "nối thêm dữ liệu nhị phân".

+0

Điều này nghe có vẻ gọn gàng hơn những gì ban đầu tôi có. Tôi chuyển sang giải pháp này. Cảm ơn. – CentAu

+1

Bạn thực sự có thể sử dụng bất kỳ loại mô tả tệp nào, ví dụ: các đường dẫn, và thậm chí cả TCP [socket] (https://docs.python.org/2/library/socket.html#socket.socket.fileno). – kay

+2

@ user292139: không liên quan: 1. không sử dụng '.communicate()' trừ khi bạn sử dụng 'PIPE'. Bạn có thể sử dụng 'subprocess.check_call ([executable_path], stdin = in_stream, stdout = out_stream)' thay thế. 2. Bạn không thể sử dụng các socket TCP ở đây, để chuyển hướng đầu ra của tiến trình con trên Windows. – jfs

6

Chuyển hướng (<, >) được diễn giải bằng trình bao. Bạn cần phải chỉ định shell=True để sử dụng chúng.

cmd = [executable_path , '<', 'tmp/input.txt', '>', 'tmp/output.txt'] 
p = subprocess.Popen(cmd, shell=True) 
p.communicate() 
+3

Đây không phải là công việc cho 'shell = True'. Sử dụng các tham số 'stdin' và' stdout' của 'Popen()' để thay thế. – kay

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