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

时间:2012-03-27 16:24:04

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

3 个答案:

答案 0 :(得分:3)

按预期工作:

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

答案 1 :(得分:3)

从子进程的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)

答案 2 :(得分:0)

我对你的处理方式并不熟悉,但你能否使用面料?

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

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