python - 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 脚本。
解决方案
你的函数定义很奇怪。一个更理智的设计是接受一个列表,就像subprocess.Popen
简单地逐字传递一样。
切线,这看起来你应该简单地使用subprocess.run()
。如果您不是特别关心输出,只需运行该进程并让它直接写入标准输出,根本不需要通过 Python。
subprocess.run(['ls', '-la'])
subprocess.run(['grep', '-r', 'SomeString', '.'])
如果您确实希望 Python 可以看到输出,请使用print(subprocess.check_output(['ls', '-la'], text=True))
类似的东西。
推荐阅读
- mvvm - 在页面加载之前设置传递的参数
- python - 从 html 按钮运行 python 脚本时出现 404 错误 托管 Google App Engine 网站
- c# - 保存到文件路径时访问被拒绝
- python - 尝试为 TimeseriesGenerator (Keras) 添加更多变量
- node.js - 如何将黄瓜小黄瓜特征文件转换为 JSON 或 AST 格式?
- function - 在函数中启动 websocket (Binance Websocket)
- data-structures - 在没有递归调用的情况下查找 AVL 树中的最小节点?
- javascript - 在 React 中什么是变异状态?
- ruby-on-rails - 为什么每次请求后访问令牌都会失效?
- python - Python 3:使用来自 pandas 数据框的像素值创建栅格