python subprocess.run shell kwarg行为

时间:2019-08-29 07:00:04

标签: python shell subprocess

关于shell关键字参数有很多问题。但是我仍然没有真正得到它,特别是如果我们使用sequence参数而不是字符串。

我的理解是,如果shell=False,则subprocess模块将在args[0]中运行可执行文件,并将其余部分作为参数传递给可执行文件。但是,如果我们使用shell=True运行它,它将像"sh -c {}".format(format_escaping(args))一样运行。

但是为什么会这样?

# Ran in OSX

subprocess.run(["touch", "12; touch 34"]) # successfuly make the file '12; touch 34'

subprocess.run(["touch", "56; touch 78"], shell=True) # does not work:
# usage:
# touch [-A [-][[hh]mm]SS] [-acfhm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...
# CompletedProcess(args=['touch', '123; touch 456'], returncode=1)

subprocess.run(["touch", "56; touch 79"], shell=True)中实际上发生了什么?

2 个答案:

答案 0 :(得分:2)

我认为使用shell=True时,首先运行parameter的首个touch,因此您将成为命令的帮助信息,请尝试如下操作:

subprocess.run("touch 56; touch 78", shell=True)

答案 1 :(得分:0)

当您使用#include <cstdint> #include <type_traits> static_assert(!std::is_same_v<char, int8_t>); static_assert(!std::is_same_v<char, uint8_t>); 传递列表时,行为取决于平台。在类似Unix的平台上,Python只是传入列表的第一个参数。在Windows上,它碰巧可以工作,尽管可能不应该。