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

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]没有这样的文件或目录

我在这里错过了什么?

fal*_*tru 6

重定向(<,>)由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)

  • 这不是`shell = True`的工作.请改用`Popen()`的参数`stdin`和`stdout`. (3认同)

kay*_*kay 5

subprocess.Popen()具有三个易于重定向的参数:stdin,stdoutstderr。默认情况下,子进程保留 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”表示“追加二进制数据”。

  • @user292139:无关:1. 除非您使用“PIPE”,否则不要使用“.communicate()”。您可以改用`subprocess.check_call([executable_path], stdin=in_stream, stdout=out_stream)`。2. 你不能在这里使用 TCP 套接字,在 Windows 上重定向子进程的输出。 (2认同)