Python:在给 subprocess.Popen 函数的命令中使用反引号

标签 python python-3.x subprocess

我正在尝试从 python3 脚本执行看起来像这样的 Unix 命令:

mycommand `cmd_giving_a_path`/file

所以我正在使用 subprocess.Popen 函数。但是无论我尝试什么,子进程都不会评估反引号之间的命令。 这是我尝试过的:

>>> subprocess.Popen(['echo', 'toto'])
<subprocess.Popen object at 0x2a98df1c50>
>>> toto

很好!

subprocess.Popen(['echo', 'toto', '`ls`'])
<subprocess.Popen object at 0x2a98df1d50>
>>> toto `ls`

也很好!

>>> subprocess.Popen(['echo', 'toto', '`ls`'], shell=True)
<subprocess.Popen object at 0x2a98df1d90>

我不明白这个:我根本没有输出。 使用此命令,我预计会生成一个 shell 并接收命令:

echo toto `ls`

但很明显,我错了!

有人可以帮忙吗?

谢谢!

PS:对于那些可能会问“你为什么需要这个?”的人答案是: 因为命令的选项是从可能包含这种语法的输入文件中读取的。

最佳答案

来自子进程的 pydoc 文档:在 UNIX 上,shell=True:如果 args 是一个字符串,它指定要通过 shell 执行的命令字符串。如果 args 是一个序列,第一项指定命令字符串,任何其他项目都将被视为额外的 shell 参数

即,您告诉子进程运行以下命令:

bash -c 'echo' 'toto' '`ls`'

正如 ephemient 所指出的,你真正想要运行的是:

bash -c 'echo toto `ls`'

您可以使用以下任一方法:

subprocess.Popen('echo toto `ls`', shell=True)
subprocess.Popen(['echo toto `ls`'], shell=True)

关于Python:在给 subprocess.Popen 函数的命令中使用反引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9893645/

相关文章:

Python-如何返回计算字符串列表中出现次数的字典?

python - 如何在读取文本文件时删除多个空格

python - 如何有条件地将一个热向量添加到 Pandas DataFrame

python - 对于不在 pypi 中的包,我应该在 pip 需求文件中放入什么

python-3.x - 获取旧问题的数量以及存储库最活跃成员的表(登录和提交数量)

python - 将队列与 tkinter(和线程)一起使用

python - 如何使我的 python 脚本不会因错误的 Popen 命令而崩溃?

带有 shell=True : redirections and platform-independent subprocess killing 的 python 子进程

python - 如何在 python 子进程之间传递大型 numpy 数组而不保存到磁盘?

python - Flask 静态文件 Cache-Control