popen中整个字符串命令和字符串列表之间的区别
Difference between whole string command and list of strings in popen
我发现大多数程序员建议使用字符串列表来表示popen 中的命令。然而,在我自己的项目中,我发现一个完整的字符串在更多情况下有效。
例如下面的作品
subprocess.Popen('pgrep -f "\./run"', stdout=subprocess.PIPE, shell=True).wait()
而
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,因此(至少)更快。也最好用于处理变量输入,因为它避免了字符串插值。
参见:
我发现大多数程序员建议使用字符串列表来表示popen 中的命令。然而,在我自己的项目中,我发现一个完整的字符串在更多情况下有效。
例如下面的作品
subprocess.Popen('pgrep -f "\./run"', stdout=subprocess.PIPE, shell=True).wait()
而
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,因此(至少)更快。也最好用于处理变量输入,因为它避免了字符串插值。
参见: