Python subprocess.Popen 因涉及双引号的多个参数而失败

Python subprocess.Popen fails with multiple arguments involving double quotes

我有一个简单的 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 这是一个简单的命令。但是当我想调用 grep -r "Some_String" .RunSubProcess 失败了。我认为此 subprocess.Popen 失败是因为命令中涉及多个参数,尤其是 "s.

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

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

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

切线地,这看起来你应该简单地使用 subprocess.run() 来代替。如果你不是特别关心输出,就运行这个过程,让它直接写到标准输出,根本不经过Python。

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

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