【问题标题】:Executing Python script using subprocess behaves differently on Ubuntu and Windows machines使用子进程执行 Python 脚本在 Ubuntu 和 Windows 机器上的行为不同
【发布时间】:2018-04-06 07:42:13
【问题描述】:

您能帮忙检查一下子进程的情况吗,它在具有相同 Python 版本的不同机器上执行不同,但一个在 Ubuntu docker 上,一个在 Windows 上。

Ubuntu 码头工人

我使用子进程执行带有参数shell=True的外部Python脚本,实际上它为我打开了一个新进程而不执行指定的脚本,所以我必须删除参数shell=True然后一切都按预期工作。

从下面的截图可以看出,我在执行第一个子进程后需要exit(),没有shell=True就运行第二个子进程。

窗口

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

【问题讨论】:

    标签: python windows python-3.x subprocess


    【解决方案1】:

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

    在 shell=True 的 POSIX 上,shell 默认为 /bin/sh。如果 args 是 string,字符串指定要通过shell执行的命令。 这意味着字符串必须完全按照它的格式进行格式化 在 shell 提示符下键入时。这包括,例如,引用或 反斜杠转义带有空格的文件名。 如果 args 是 序列,第一项指定命令字符串,任何 附加项将被视为 shell 的附加参数 自己。

    (强调我的)

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

    进一步:

    您需要在 Windows 上指定 shell=True 的唯一情况是 您希望执行的命令内置在 shell 中(例如 dir 或 复制)。您不需要 shell=True 来运行批处理文件或基于控制台 可执行文件。

    结论:尽可能将参数作为列表传递(就像您所做的那样),但不要使用shell=True

    【讨论】:

    • 非常感谢 mkrieger1!很好的答案!
    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 2015-05-03
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多