Python subprocess.call/Popen/system 问题

1 投票
1 回答
616 浏览
提问于 2025-04-20 04:19

我正在通过不同的方法启动一个子进程,比如使用 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 中一样(因为 shelltrue)。所以在这种情况下,只有一个实例,就是你通过这个子进程调用的那个。

但无论如何,我还是不明白为什么会有两个进程,而不是简单的一个。调用者 - 好吧,但第二个进程是从哪里来的?为什么不只用一个进程就行?

1 个回答

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不会等这个程序完成就继续执行,而且当你的程序退出时,可能会留下一个“僵尸”进程。

撰写回答