在我目前的设置中,我有
command = "somecommand '%s'" % test
subprocess.Popen(command.split(), stdout=subprocess.PIPE)
我有内部引号''的原因是因为我在测试中有空格但它应该被解释为1个字符串(路径)。
但是,我注意到该命令会抛出一个错误,因为它尝试使用path参数及其自己的附加字符串,因此我们有''path'/ format',它会引发错误。
然而,当我执行某个命令'path'时它会起作用,因为我猜的shell会解释字符串吗?这是正确的推理吗?
我的问题是如何处理这种情况,在通过Popen运行之前需要在shell中解释字符串?
答案 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)