Python 带有更大符号 (>) 的子进程调用不起作用

Python subprocess call with greater sign (>) not working

我有一个接受字符串并输出另一个字符串的可执行文件。现在我需要将一个文件作为输入提供给它,并将输出写入另一个文件。标准命令如下 executable_path < input > output。现在我将其包装在 python 中。但我得到错误。

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

invalid argument: <

我也尝试加入 cmd 参数:

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

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

将命令作为字符串传递也不起作用。

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

OSError: [Errno 2] No such file or directory

我在这里错过了什么?

重定向(<>)由 shell 解释。您需要指定 shell=True 才能使用它们。

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

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() 的参数是文件名、模式和缓冲。 "rb"表示"read binary data","wb"表示“(覆盖)写入二进制数据”,"ab"表示"append binary data"。