gpt4 book ai didi

Python subprocess.call/Popen/系统问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:20 26 4
gpt4 key购买 nike

我通过不同的方式启动一个子进程 - subprocess.call、Popen、os.system。

例如:

subprocess.call('wine application.exe', shell=True)

但是python启动了2个进程:

/bin/sh -c wine application.exe
应用程序.exe

当我通过在控制台窗口 wine application.exe 中调用手动启动此应用程序时,我在 ps ax 中只看到 application.exe 实例.

这正常吗?我的猜测是没问题,因为它是子进程,它的父进程等待子进程完成。但是,为什么这种行为与我从控制台启动应用程序不同?在这种情况下, parent 藏在哪里?

更新:我苦思冥想,明白这才是真正的父进程。如果我将使用以下命令从 python 启动应用程序:subprocess.call('wine application.exe &', shell=True)它将具有与 shell 中相同的行为(因为 shelltrue)。所以在这种情况下,它将只有一个实例 - 您通过此子流程调用调用的实例。

但无论如何我仍然不明白为什么有 2 个进程而不是一个。 Invoker - 好的,但是第二个进程来自哪里?为什么它不适用于 1 个进程?

最佳答案

当您使用 shell=True 启动应用程序时,python 启动一个 shell,然后 shell 启动程序。这就是您看到两个程序的原因。如果你像这样运行它

subprocess.call(['wine', 'application.exe'])

你只会看到一个。

当您从命令行运行它时,您已经在 shell 中,所以您只看到 1。

更新

当您运行 subprocess.call('wine application.exe &', shell=True) 时,python 执行了一个执行 wine 的 shell。由于您添加了 &,shell 以 wine 为背景并退出。虽然这可能是您想要的,但潜在的缺点是 python 不会等待进程完成,并且当您的程序退出时会留下一个僵尸进程。

关于Python subprocess.call/Popen/系统问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25701344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com