首页 > 解决方案 > Python subprocess.run shell kwarg 行为

问题描述

shell关于关键字参数有很多问题。但我仍然不明白,特别是如果我们使用序列参数而不是字符串。

我的理解是,如果shell=Falsesubprocess模块将在其中运行可执行文件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)什么?

标签: pythonshellsubprocess

解决方案


我认为shell=Truesupbrocess 仅首先运行第一个parametertouch因此您将成为命令的帮助消息,请改为这样尝试:

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

推荐阅读