Python popen中整字符串命令和字符串列表之间的差异

Python popen中整字符串命令和字符串列表之间的差异,python,shell,command,popen,Python,Shell,Command,Popen,我发现大多数程序员建议使用字符串列表来表示popen中的命令。然而,在我自己的项目中,我发现整个字符串在更多的情况下工作 例如,以下工作 subprocess.Popen('pgrep -f "\./run"', stdout=subprocess.PIPE, shell=True).wait() 当 没有 我可以知道这两种实现方式之间的区别吗?为什么第二种方式不能按预期工作?第二种方式不应该有shell=True参数。相反,它应该是: subprocess.Popen(['pgrep','-

我发现大多数程序员建议使用字符串列表来表示popen中的命令。然而,在我自己的项目中,我发现整个字符串在更多的情况下工作

例如,以下工作

subprocess.Popen('pgrep -f "\./run"', stdout=subprocess.PIPE, shell=True).wait()

没有


我可以知道这两种实现方式之间的区别吗?为什么第二种方式不能按预期工作?

第二种方式不应该有
shell=True
参数。相反,它应该是:
subprocess.Popen(['pgrep','-f','\./run'],stdout=subprocess.PIPE)。wait()

shell
参数设置是否在单独的shell中执行命令。也就是说,如果只为了执行命令而生成一个新的shell,则必须由shell解释该命令,然后才能运行该命令

但是,当提供字符串列表时,这不会生成第二个shell,因此(至少)会更快。它也更好地用于处理变量输入,因为它避免了字符串插值


请参阅:

请参阅。在这种情况下,更好的版本会失败,因为您的参数应该是
'\./run'
,而不是
'\./run'
。我甚至想说,您永远不应该使用
shell=True
。但是如果命令依赖于某些环境设置,我将需要使用
shell=True
,对吗@除非在shell的init文件中设置了环境,否则任何命令都将继承与shell相同的环境变量。如果您有特定的、好的理由需要一个shell,最好显式地调用它,如
['/bin/bash','-c',some shell command',args…']
,因为这样可以让您选择依赖的shell并更安全地传递数据。收到了,非常感谢@另一个传递带有
shell=True
的列表的人在Windows上不会立即失败,但可以说是错误的。在类似Unix的平台上,它会“神秘地”丢失第一次之后的项目。也许你也会看到
subprocess.Popen(['pgrep', '-f', '"\./run"'], stdout=subprocess.PIPE, shell=True).wait()