2014-09-06 59 views
1

我以不同的方式啓動子進程 - subprocess.call,Popen,os.system。Python subprocess.call/Popen/system問題

例如:

subprocess.call('wine application.exe', shell=True) 

但是Python啓動2個進程:

/bin/sh -c wine application.exe application.exe

當我通過調用控制檯窗口wine application.exe手動啓動該應用程序,我看到ps ax只有application.exe實例。

這是正常的嗎? 我的猜測是可以的,因爲它是子過程,它的父母等待孩子完成。但是,爲什麼這種行爲與我從控制檯啓動應用程序不一樣?在這種情況下,父母隱藏?

更新: 我一直認爲,這是真正的父母過程。如果我將蟒蛇啓動應用程序有: subprocess.call('wine application.exe &', shell=True) 它將具有相同的行爲在外殼(因爲外殼)。 所以在這種情況下,它只會有一個實例 - 這個子進程調用所調用的實例。

但無論如何,我仍然不明白爲什麼有2個進程,而不是簡單的一個。 Invoker - 好的,但第二個過程來自哪裏?爲什麼它不適用於一個進程?

回答

1

當你用shell = True啓動一個應用程序時,python啓動一個shell並且shell啓動程序。這就是爲什麼你看到兩個節目。如果你運行它像

subprocess.call(['wine', 'application.exe']) 

你只會看到一個。

當你在命令行中運行它時,你已經在shell所以你只看到了1

更新

當你跑subprocess.call('wine application.exe &', shell=True),蟒蛇執行其執行酒外殼。由於您添加了&,殼酒和退出酒。雖然這可能是你想要的,但是潛在的缺點是python不會等待這個過程完成,當你的程序退出時,將會有一個殭屍進程。