我有一个接受字符串并输出另一个字符串的可执行文件。现在我需要将文件作为输入提供给它并将输出写入另一个文件。标准命令类似于以下executable_path < input > output
。现在我将它包装在python中。但我得到错误。
cmd = [executable_path , '<', 'tmp/input.txt', '>',
'tmp/output.txt']
p = subprocess.Popen(cmd)
p.communicate()
无效参数:&lt;
我也尝试加入cmd参数:
cmd = [executable_path, ' '.join(['<', 'tmp/input.txt', '>',
'tmp/output.txt'])]
无效参数:&lt; tmp / input.txt&gt; TMP / output.txt的
将命令作为字符串传递也不起作用。
p = subprocess.Popen(' '.join(cmd))
OSError:[Errno 2]没有这样的文件或目录
我在这里缺少什么?
答案 0 :(得分:6)
重定向(>>> l=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>> x=[v[3] for v in l]
>>> x
[4, 8, 12]
,<
)由shell解释。您需要指定>
才能使用它们。
shell=True
答案 1 :(得分:4)
subprocess.Popen()有三个易于重定向的参数:stdin
,stdout
和stderr
。默认情况下,子进程会保留Python实例的文件描述符。
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)
与shell命令executable_path < tmp/input.txt > tmp/output.txt
相同。
open()的参数是文件名,模式和缓冲。 &#34; RB&#34;意味着&#34;读取二进制数据&#34;,&#34; wb&#34;意味着&#34;(over)写二进制数据&#34;,&#34; ab&#34;意味着&#34;追加二进制数据&#34;。