带有更大符号(>)的Python子进程调用无效

时间:2015-07-06 14:19:21

标签: python subprocess popen

我有一个接受字符串并输出另一个字符串的可执行文件。现在我需要将文件作为输入提供给它并将输出写入另一个文件。标准命令类似于以下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]没有这样的文件或目录

我在这里缺少什么?

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()有三个易于重定向的参数:stdinstdoutstderr。默认情况下,子进程会保留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;。