你能帮助检查一下子进程发生了什么,它在具有相同Python版本的不同机器上执行的方式不同,但是一个在Ubuntu docker上,一个在Windows上。
我使用subprocess来执行带有参数shell=True
的外部Python脚本,实际上它为我打开了一个新进程而没有执行指定的脚本,所以我必须删除参数shell=True
然后一切正常如预期的那样。
您可以从下面的屏幕截图中看到,执行第一个子流程后我需要exit()
,并在没有shell=True
的情况下运行第二个子流程。
在Windows中,shell=True
与我在没有shell=True
参数的情况下在Ubuntu中执行子进程的工作方式相同。
答案 0 :(得分:1)
引用https://docs.python.org/3/library/subprocess.html#popen-constructor:
在POSIX上,shell = True,shell默认为/ bin / sh。如果args是 string,string指定通过shell执行的命令。 这意味着字符串必须完全按照原样进行格式化 在shell提示符下键入时。这包括,例如,引用或 反斜杠转义文件名,其中包含空格。 如果args是 sequence,第一项指定命令字符串,以及任何 其他项目将被视为shell的附加参数 本身。强>
(强调我的)
这意味着,在您使用run(['python', 'script.py'], shell=True)
的第一个示例中,您实际上只是启动交互式Python会话而不是将脚本传递给解释器。
此外:
你需要在Windows上指定shell = True的唯一时间是 你想要执行的命令是内置在shell中的(例如dir或 复制)。您不需要shell = True来运行批处理文件或基于控制台 可执行文件。
结论:尽可能将参数作为列表传递(与您一样),但不要使用shell=True
。