【问题标题】:Python: Use backquotes in command given to subprocess.Popen functionPython:在给 subprocess.Popen 函数的命令中使用反引号
【发布时间】:2012-03-27 16:24:04
【问题描述】:

我正在尝试从 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:对于那些可能会问“你为什么需要这个?”的人。答案是: 因为命令的选项是从可能包含这种语法的输入文件中读取的。

【问题讨论】:

  • 输入文件中有什么else
  • 我不确定你的意思是什么?您是在谈论环境变量之类的东西吗?
  • 我的意思是,如果输入文件 only 包含这些内容,那么您为什么要尝试从 python 中“解释”它,而不是仅仅将其作为 Bash 脚本或其他方式运行?
  • 其实我正在尝试实现一个可配置的编译脚本。我需要为不同的工具和不同的选项集编译源代码。所以我有一个包含类似行的文件:tool1 set1 : -options... 根据用户选择的工具和选项,我提取相应的选项并将其提供给所选工具。文件列表存储在另一个也被解析的文件中。我可以使用 Makefile,但我不知道如何编写好的文件,我更喜欢 Python 命令行解析器。你觉得我的方法不好?
  • 已经有一个相当标准的 Python 编译脚本实用程序:SCons

标签: python python-3.x subprocess


【解决方案1】:

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

也就是说,您告诉子进程运行以下命令:

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

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

bash -c 'echo toto `ls`'

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

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

【讨论】:

  • 感谢您的详细解释。我是 python 新手,我对 Popen 函数提供的可能性感到完全困惑。多亏了你,现在更清楚了!
【解决方案2】:

按预期工作:

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

【讨论】:

  • 也谢谢你。即使它没有其他答案那么详细,我也明白出了什么问题。
【解决方案3】:

我不熟悉您的处理方式,但您可以使用织物吗?

链接:http://docs.fabfile.org/en/1.4.0/index.html

我认为编写一个从文件中读取并使用结构执行这些命令的函数会很简单。

【讨论】:

  • 感谢您的回答。但我知道我可以用标准库做我想做的事。而且我不喜欢安装新的包来减少依赖!
猜你喜欢
  • 2013-02-02
  • 2021-06-26
  • 1970-01-01
  • 2015-05-29
  • 2020-05-29
  • 2013-07-20
  • 1970-01-01
  • 2022-08-13
相关资源
最近更新 更多