Python subprocess.call/Popen/system问题

时间:2014-09-06 14:39:34

标签: 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 application.exe

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

这是正常的吗? 我的猜测是没关系,因为它是子进程,它的父进程等待子进程。但是,为什么这种行为与我从控制台启动应用程序不一样?在这种情况下父母隐藏在哪里?

更新 我认真思考并且明白这是父进程。如果我将从python启动应用程序: subprocess.call('wine application.exe &', shell=True) 它将具有与shell相同的行为(因为 shell true )。 因此,在这种情况下,它只是一个实例 - 您通过此子进程调用调用的实例。

但无论如何我仍然不明白为什么有2个进程而不是简单的进程。祈求者 - 好吧,但第二个过程来自哪里?为什么它不适用于1个流程?

1 个答案:

答案 0 :(得分:1)

当你启动一个shell = True的应用程序时,python启动一个shell,shell启动程序。这就是你看两个程序的原因。如果你像

那样运行它
subprocess.call(['wine', 'application.exe'])

你只会看到一个。

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

<强>更新

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