Cen*_*tAu 6 python subprocess popen
我有一个可执行文件接受字符串并输出另一个字符串.现在我需要将一个文件作为输入提供给它并将输出写入另一个文件.标准命令如下所示executable_path < input > output.现在我将它包装在python中.但我得到错误.
cmd = [executable_path , '<', 'tmp/input.txt', '>',
'tmp/output.txt']
p = subprocess.Popen(cmd)
p.communicate()
Run Code Online (Sandbox Code Playgroud)
无效的参数:<
我也尝试加入cmd参数:
cmd = [executable_path, ' '.join(['<', 'tmp/input.txt', '>',
'tmp/output.txt'])]
Run Code Online (Sandbox Code Playgroud)
无效参数:<tmp/input.txt> tmp/output.txt
将命令作为字符串传递也不起作用.
p = subprocess.Popen(' '.join(cmd))
Run Code Online (Sandbox Code Playgroud)
OSError:[Errno 2]没有这样的文件或目录
我在这里错过了什么?
重定向(<,>)由shell解释.您需要指定shell=True使用它们.
cmd = [executable_path , '<', 'tmp/input.txt', '>', 'tmp/output.txt']
p = subprocess.Popen(cmd, shell=True)
p.communicate()
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
与 shell 命令的作用相同executable_path < tmp/input.txt > tmp/output.txt。
open()的参数是文件名、模式和缓冲。“rb”表示“读取二进制数据”,“wb”表示“(覆盖)写入二进制数据”,“ab”表示“追加二进制数据”。