Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.call/Popen/system issue_Python_Linux_Shell_Subprocess_Call - Fatal编程技术网

Python subprocess.call/Popen/system issue

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、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进程一起工作?

当您使用shell=True启动应用程序时,python启动一个shell,shell启动程序。这就是为什么你会看到两个节目。如果你像这样运行它

subprocess.call(['wine', 'application.exe'])
你只会看到一个

当您从命令行运行它时,您已经在shell中,因此只看到1

更新

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