subprocess.Popen和shell解释

时间:2013-06-07 18:10:53

标签: python bash

在我目前的设置中,我有

command = "somecommand '%s'" % test
subprocess.Popen(command.split(), stdout=subprocess.PIPE)

我有内部引号''的原因是因为我在测试中有空格但它应该被解释为1个字符串(路径)。

但是,我注意到该命令会抛出一个错误,因为它尝试使用path参数及其自己的附加字符串,因此我们有''path'/ format',它会引发错误。

然而,当我执行某个命令'path'时它会起作用,因为我猜的shell会解释字符串吗?这是正确的推理吗?

我的问题是如何处理这种情况,在通过Popen运行之前需要在shell中解释字符串?

3 个答案:

答案 0 :(得分:3)

从头开始创建一个列表:

command = ["somecommand", test]
subprocess.Popen(command, stdout=subprocess.PIPE)

即使test包含空格,这也会有效,因为subprocess.Popen()将命令列表中的每个条目作为单个参数传递。

答案 1 :(得分:2)

您想使用shlex.split来分割command

subprocess.Popen(shlex.split(command),stdout=subprocess.PIPE)

问题在于str.split如果你试图在引号中加入某些内容并不在意 - 无论你引用多少内容,它都会将字符串拆分为空格。 e.g。

>>> "foo 'bar baz'".split()
['foo', "'bar", "baz'"]
>>> import shlex
>>> shlex.split("foo 'bar baz'")
['foo', 'bar baz']

答案 2 :(得分:1)

shell没有处理你的命令;列表的每个部分都直接传递给exec系列级函数系列的某个成员。

要让shell处理您的命令,您需要设置shell参数:

command = "somecommand '%s'" % test
subprocess.Popen(command.split(), shell=True, stdout=subprocess.PIPE)

但更好的解决方案是跳过shell,在这种情况下,您不需要引用值:

command = [somecommand, test]
subprocess.Popen(command, stdout=subprocess.PIPE)