Python subprocess.call/Popen/system 问题
我正在通过不同的方法启动一个子进程,比如使用 subprocess.call、Popen 和 os.system。
举个例子:
subprocess.call('wine application.exe', shell=True)
但是,Python 启动了两个进程:
/bin/sh -c wine application.exe
application.exe
当我在控制台窗口手动输入 wine application.exe
启动这个应用时,我只在 ps ax
中看到 application.exe
的实例。
这正常吗?我猜这没问题,因为这是子进程,父进程在等待子进程完成。但是,为什么这种行为和我从控制台启动应用时不一样?在这种情况下,父进程去哪了?
更新:我仔细想了想,明白了这确实是父进程。如果我用以下方式从 Python 启动应用:
subprocess.call('wine application.exe &', shell=True)
它的行为就和在 shell 中一样(因为 shell 是 true)。所以在这种情况下,只有一个实例,就是你通过这个子进程调用的那个。
但无论如何,我还是不明白为什么会有两个进程,而不是简单的一个。调用者 - 好吧,但第二个进程是从哪里来的?为什么不只用一个进程就行?
1 个回答
当你用shell=True启动一个应用程序时,Python会先启动一个命令行工具(叫做shell),然后这个工具再启动你的程序。所以你会看到有两个程序在运行。如果你像这样运行:
subprocess.call(['wine', 'application.exe'])
你就只会看到一个程序。
当你从命令行运行时,你已经在shell里面了,所以你只看到一个程序。
更新
当你运行 subprocess.call('wine application.exe &', shell=True)
时,Python会执行一个shell,然后这个shell再执行wine。因为你加了&,所以这个shell会把wine放到后台运行,然后自己退出。虽然这样做可能是你想要的,但潜在的问题是Python不会等这个程序完成就继续执行,而且当你的程序退出时,可能会留下一个“僵尸”进程。