使用子进程执行Python脚本在Ubuntu和Windows机器上的行为有所不同

时间:2018-04-06 07:42:14

标签: python windows python-3.x subprocess

你能帮助检查一下子进程发生了什么,它在具有相同Python版本的不同机器上执行的方式不同,但是一个在Ubuntu docker上,一个在Windows上。

Ubuntu docker

我使用subprocess来执行带有参数shell=True的外部Python脚本,实际上它为我打开了一个新进程而没有执行指定的脚本,所以我必须删除参数shell=True然后一切正常如预期的那样。

您可以从下面的屏幕截图中看到,执行第一个子流程后我需要exit(),并在没有shell=True的情况下运行第二个子流程。

screenshot in ubuntu

在Windows中,shell=True与我在没有shell=True参数的情况下在Ubuntu中执行子进程的工作方式相同。

screenshot in windows

1 个答案:

答案 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