我以不同的方式启动子进程 - 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个流程?
答案 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不会等待进程完成,并且当你的程序退出时会有一个僵尸进程遗留下来。