2008-12-08 3 views
1

Следующая не работает, потому что он не ждет, пока процесс не будет завершен:Запустить ярлык под окнами

import subprocess 
p = subprocess.Popen('start /WAIT /B MOZILL~1.LNK', shell=True) 
p.wait() 

Любая идея, как запустить ярлык и ждать, что возвращается подпроцесса?

Edit: изначально я пытался это без оболочки варианта в моем посте, который вызвал Popen на провал. Фактически, start не является исполняемым, а командованием оболочки. Это было исправлено благодаря Джим.

+0

Что вы хотите сделать, с точки зрения «контроля над запущенным процессом»? – Tomalak

+0

Подпроцесс возвращает объект. os.system просто возвращает код. Это то, что я имею в виду, имея лучший контроль над выполненной программой – Mapad

ответ

4

Вам нужно будет вызвать оболочку, чтобы получить возможность подпроцесс работать:

p = subprocess.Popen('start /B MOZILL~1.LNK', shell=True) 
p.wait() 

Это, однако, будет по-прежнему выйти немедленно (см @r Bemrose.).

Если p.pid содержит правильный pid (я не уверен в окнах), вы можете использовать os.waitpid(), чтобы ждать выхода программы. В противном случае вам может понадобиться использовать некоторую магию win32 com.

+0

Это частично разрешило проблему. Теперь работает команда subprocess.Popen. Но все же p.wait() возвращается, как только процесс запускается. – Mapad

+0

попробуйте p.pid и os.waitpid() - обновленный ответ – JimB

+0

p.pid правильный, но os.waitpid не будет работать. Я думаю, вы правы, мне нужно перейти на модуль win32process и запустить процесс через этот интерфейс. Я еще не закончил, но я приближаюсь. Спасибо за вашу помощь! – Mapad

0

Примечание: Я просто добавляю ответ Джима с небольшим трюком. Как насчет опции 'WAIT' для запуска?

p = subprocess.Popen('start /B MOZILL~1.LNK /WAIT', shell=True) 
p.wait() 

Это должно сработать.

+0

К сожалению, это ничего не меняет – Mapad

3

cmd.exe завершается, как только запуск запускает программу. Такое поведение документально (в начале /?):

Если команда расширение включено, внешней команда вызова через командной строки или команду START изменяется следующим образом:

...

При выполнении приложения, которое 32-битное приложение с графическим интерфейсом, CMD.EXE не ждать завершения приложения Befo re вернется к командной строке. Это новое поведение НЕ происходит при выполнении в командном скрипте.

Как это влияет на флаг/wait, я не уверен.

Смежные вопросы