关于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)
中实际上发生了什么?
答案 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上,它碰巧可以工作,尽管可能不应该。