Python subprocess.call/Popen/system issue
我通过不同的方式启动子流程-subprocess.call、Popen、os.system 例如:Python subprocess.call/Popen/system issue,python,linux,shell,subprocess,call,Python,Linux,Shell,Subprocess,Call,我通过不同的方式启动子流程-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实例 这正常吗? 我猜这是可
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,shell启动程序。这就是为什么你会看到两个节目。如果你像这样运行它
subprocess.call(['wine', 'application.exe'])
你只会看到一个
当您从命令行运行它时,您已经在shell中,因此只看到1
更新
当您运行subprocess.call('wine application.exe&',shell=True)
时,python执行了一个执行wine的shell。自从你加了&,贝壳就以葡萄酒为背景退出了。虽然这可能是您想要的,但潜在的缺点是python不会等待进程完成,并且当您的程序退出时会留下一个僵尸进程