我通过不同的方式启动一个子进程 - 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 中相同的行为(因为 shell 是 true)。
所以在这种情况下,它将只有一个实例 - 您通过此子流程调用调用的实例。
但无论如何我仍然不明白为什么有 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/