繁体   English   中英

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

[英]Executing Python script using subprocess behaves differently on Ubuntu and Windows machines

您能否帮助检查子进程的情况,它在具有相同Python版本的不同计算机上的执行情况不同,但是一个在Ubuntu docker上运行,另一个在Windows上运行。

Ubuntu码头工人

我使用子进程执行带有参数shell=True的外部Python脚本,实际上它为我打开了一个新进程,而不执行指定的脚本,因此我必须删除参数shell=True ,然后一切正常。

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

ubuntu中的屏幕截图

视窗

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

Windows中的屏幕截图

引用https://docs.python.org/3/library/subprocess.html#popen-constructor

在shell = True的POSIX上,shell默认为/ bin / sh。 如果args是字符串,则该字符串指定要通过外壳执行的命令。 这意味着字符串的格式必须与在shell提示符下键入时的格式完全相同。 例如,这包括在文件名中使用引号或反斜杠转义。 如果args是序列,则第一项指定命令字符串,任何其他项都将被视为shell本身的其他参数。

(强调我的)

这意味着,在您第一个使用run(['python', 'script.py'], shell=True)示例中,您实际上只是在开始一个交互式Python会话,而没有将脚本传递给解释器。

进一步:

在Windows上唯一需要指定shell = True的时间是将要执行的命令内置到shell中(例如dir或copy)。 您不需要shell = True即可运行批处理文件或基于控制台的可执行文件。

结论:尽可能将参数作为列表传递(与您一样),但不要使用shell=True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM