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))
或类似的东西。
我有一个简单的 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))
或类似的东西。