首页 > 解决方案 > Python subprocess.Popen 因涉及双引号的多个参数而失败

问题描述

我有一个简单的 Python 脚本,可以实时打印命令的输出。以下是脚本。

#!/usr/bin/env python3

import subprocess

def RunSubProcess(process, process_args):
    process = subprocess.Popen([process, process_args], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    while process.stdout.readable():
        line = process.stdout.readline()
        if not line:
            break
        print(line.strip())

# Below works for an example since it is a simple command with one argument
RunSubProcess('ls', '-la')

# But below does not work because of multiple args and double qoutes involved
RunSubProcess('grep', '-r "Some_String" .')

问题:
如您所见,我有一个可重用的方法RunSubProcess,该方法将命令作为第一个参数,将命令的参数作为第二个参数。

RunSubProcess效果很好,ls -la这是一个简单的命令。但是RunSubProcess当我想打电话时失败了grep -r "Some_String" .。我认为这subprocess.Popen是失败的,因为命令中涉及多个参数,尤其是"s.

如何process_args通过确保处理双引号和多个参数来正确传递?

环境:
我在安装了 Python 3.9.0 的 macos 上的 bash shell 上运行这个 Python 脚本。

标签: pythonpython-3.xsubprocess

解决方案


你的函数定义很奇怪。一个更理智的设计是接受一个列表,就像subprocess.Popen简单地逐字传递一样。

切线,这看起来你应该简单地使用subprocess.run()。如果您不是特别关心输出,只需运行该进程并让它直接写入标准输出,根本不需要通过 Python。

subprocess.run(['ls', '-la'])
subprocess.run(['grep', '-r', 'SomeString', '.'])

如果您确实希望 Python 可以看到输出,请使用print(subprocess.check_output(['ls', '-la'], text=True))类似的东西。


推荐阅读