【问题标题】:Python subprocess call with greater sign (>) not working [duplicate]具有更大符号(>)的Python子进程调用不起作用[重复]
【发布时间】:2015-07-06 14:19:21
【问题描述】:

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

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

无效参数:

我也尝试加入 cmd 参数:

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

无效参数: tmp/output.txt

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

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

OSError: [Errno 2] 没有这样的文件或目录

我在这里错过了什么?

【问题讨论】:

    标签: python subprocess popen


    【解决方案1】:

    重定向(&lt;&gt;)由 shell 解释。您需要指定shell=True 才能使用它们。

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

    【讨论】:

    • 这不是shell=True 的工作。请改用Popen()的参数stdinstdout
    【解决方案2】:

    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 &lt; tmp/input.txt &gt; tmp/output.txt作用相同。

    open() 的参数是文件名、模式和缓冲。 “rb”表示“读取二进制数据”,“wb”表示“(覆盖)写入二进制数据”,“ab”表示“追加二进制数据”。

    【讨论】:

    • 这听起来比我原来的更整洁。我切换到这个解决方案。谢谢。
    • 你真的可以使用任何类型的文件描述符,例如管道,甚至 TCP sockets
    • @user292139: 无关: 1. 不要使用.communicate(),除非你使用PIPE。您可以改用subprocess.check_call([executable_path], stdin=in_stream, stdout=out_stream)。 2. 你不能在这里使用 TCP 套接字,在 Windows 上重定向子进程的输出。
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2011-04-15
    • 1970-01-01
    • 2014-10-17
    • 2016-02-12
    • 2016-06-14
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多