Python subprocess.call/Popen/系统问题

标签 python linux shell subprocess call

我通过不同的方式启动一个子进程 - 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/

相关文章:

python - 无法从 long 转换 float

python 检查有效的电子邮件

python - 是否可以打开一个大的 csv 而不将其完全加载到 RAM

linux - 使用awk在矩阵中插入一行和一列

linux - 围绕 nc 命令编写的 bash 脚本。如何在每行之前添加文本?

python - 这个 Python 生成器是如何工作的?

c - OS X 10.10 上 ucontext makecontext 的段错误

python - 在 debian 上安装 scrapy

bash - 修改 BASH 脚本以处理我告诉它的任何文件

bash - 使用 GNU find 只显示叶目录