0

在我目前的设置中,我有

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

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

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

但是,当我执行一些命令“路径”时,它会起作用,因为我猜的 shell 会解释字符串?这是正确的推理吗?

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

4

3 回答 3

3

从头开始创建命令列表:

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

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

于 2013-06-07T18:13:19.810 回答
2

您想使用shlex.split拆分command

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

问题是它str.split不在乎你是否试图把一些东西放在引号里——不管你引用了多少东西,它都会在空格上分割字符串。例如

>>> "foo 'bar baz'".split()
['foo', "'bar", "baz'"]
>>> import shlex
>>> shlex.split("foo 'bar baz'")
['foo', 'bar baz']
于 2013-06-07T18:12:41.027 回答
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)
于 2013-06-07T18:15:00.037 回答