Запуск ярлыка под окнами

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

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

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

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

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

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

Однако это все равно выйдет немедленно (см. @R. Bemrose).

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

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

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

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

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

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

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

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