2014-09-06 3 views
1

Я начинаю подпроцесс различными способами - subprocess.call, Popen, os.system.Python subprocess.call/Popen/system issue

Например:

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

Но начинается питон 2 процессов:

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

Когда я начинаю это приложение вручную, вызвав в консольном окне wine application.exe я вижу только application.exe экземпляр в ps ax.

Нормально ли это? Я предполагаю, что это нормально, потому что это подпроцесс, и его родитель ждет окончания ребенка. НО, почему это поведение не то же самое, что я запустил приложение с консоли? Где в этом случае родитель скрывается?

Обновление: Я подумал, что это действительно родительский процесс. Если я буду запускать приложение из питона с: subprocess.call('wine application.exe &', shell=True) он будет иметь такое же поведение, как и в оболочке (потому что оболочки является верно). Таким образом, в этом случае это будет только один экземпляр - тот, который вы вызывали этим вызовом подпроцесса.

Но в любом случае я до сих пор не понимаю, почему существует 2 процесса вместо одного. Invoker - хорошо, но откуда пришел второй процесс? Почему это не работает с одним процессом?

ответ

1

Когда вы запускаете приложение с оболочкой = True, python запускает оболочку, а оболочка запускает программу. Вот почему вы видите две программы. Если вы запустите его, как

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

вы увидите только один.

Когда вы запускали из командной строки, вы уже были в оболочке, так что вы только видели 1.

Update

Когда выбежала subprocess.call('wine application.exe &', shell=True), питон выполнил оболочку, которая выполняется вино. С тех пор, как вы добавили &, оболочка фонового вина и вышла. Хотя это может быть то, что вы хотите, потенциальными недостатками являются то, что python не ждет завершения процесса, и после выхода вашей программы будет оставлен процесс зомби.