2014-11-08 1 views
4

Я работаю на платформе Windows. В моем питон скрипт, я могу сделать вызов внешней программы следующим образом:Как узнать, завершился ли внешний процесс в python?

os.system("C:\mainfolder\menu.exe C:\others\file1.inp C:\others\file2.inp") 

os.popen("C:\mainfolder\menu.exe C:\others\file1.inp C:\others\file2.inp") 

subprocess.call(["C:\mainfolder\menu.exe","C:\others\file1.inp" "C:\others\file2.inp"]) 

где:

menu.exe: это мой внешнюю программу.

file1 и file2: входные файлы в мою внешнюю программу.

Все это работает отлично. Теперь, когда моя внешняя программа завершилась успешно, мне нужно полностью закрыть ее вместе со всеми открытыми ею окнами. Я прошел через много других сообщений, питона документации, и т.д., и нашел команды, как, например:

os.system("taskkill /im C:\mainfolder\menu.exe") 

os.kill(proc.pid,9) 

child.kill() 

Но они не работали. Я потратил много времени на то, чтобы найти что-то, что сработало для меня, пока я не понял, что независимо от того, какие команды я набираю после, они не будут прочитаны, поскольку компьютер не знает, что моя внешняя программа закончена. Именно по этой причине я могу легко завершить программу из командной строки в любое время, просто набрав taskkill/im menu.exe, но не из python.

Кто-нибудь знает, как разобраться в этом ?, включить ли я что-то еще, когда я позвоню своей внешней программе?

+0

Если программа, которую вы звоните открывает другие программы, вы не можете быть в состоянии сделать что-нибудь об этом. Хотя я не уверен. –

+0

Серьезно ?, Я не слишком много знаю о программировании, но я всегда думал, что в программировании все возможно.Надеюсь, я найду ответ на этот вопрос :-( – Sarah

+0

Если вы можете изменить открытые программы для отправки сигнала вашему процессу прямо перед тем, как они закрываются (например, через DBus), вы можете использовать IPC, чтобы понять это. – BlackVegetable

ответ

0

Если вы хотите иметь конец процесса немедленно, то есть, ждать его до конца, это блокирующий вызов, и os.system() обычно ждет, обсуждал here, а также .communicate[0] с использованием подпроцесса there.

Если вы хотите, чтобы завершить процесс позже в вашей программе, асинхронный, неблокирующий процесс, возможно, получить его pid и в зависимости от того, shell=True или не то, что будет либо Идентификатор из spawned shell или дочернего процесса.

Этот pid может использоваться для его завершения либо immediately с использованием psutil или os, либо wait until it ends с использованием небольшого времени процессора, хотя тогда другие задачи могут выполняться во время ожидания или могут использоваться потоки.

2

Вот пример кода, как определить, открывает ли программа окно. Все, что вам нужно знать, это название окна сообщения, что menu.exe открывается, когда она будет закончена:

import subprocess 
import win32gui 
import time 


def enumHandler(hwnd, lParam): 
    if win32gui.IsWindowVisible(hwnd): 
     if 'Menu.exe Finished' in win32gui.GetWindowText(hwnd): 
      proc.kill() 

proc = subprocess.Popen(["C:\mainfolder\menu.exe","C:\others\file1.inp" "C:\others\file2.inp"]) 
while proc.poll() is None: 
    win32gui.EnumWindows(enumHandler, None) 
    time.sleep(1) 
+0

Этот код завершает мою программу, когда обнаруживает, что есть активное окно? – Sarah

+0

Завершает работу программы, если есть окно с определенным заголовком. – Daniel

+0

Это действительно полезный код, я не знал об этом. Однако в моем случае это окно открывается в самом начале процесса. Пока моя программа работает, она скажет: «Обработка», и когда она закончит обработку моих данных, она скажет: «Закончено». Заголовок окна остается прежним. Название окна - это имя моей программы. Возможно, есть способ извлечь слово из окна вместо заголовка ?. – Sarah

0

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

С помощью людей, которые попытались ответить на мой вопрос, особенно на вопрос Даниэля, я нашел решение для своей проблемы. Не уверен, что это лучший, но я получил то, что мне нужно.

В основном вместо того, чтобы искать слово «закончено» в моем всплывающем окне, я искал результаты, которые генерирует моя внешняя программа. Если были получены эти результаты, то это означает, что программа закончена, так что я потом убить процесс:

proc=subprocess.Popen(["C:\mainfolder\menu.exe","C:\others\file1.inp" "C:\others\file2.inp"]) 
while proc.poll() is None: 
    if os.path.exists("D:\\Results_folder\\Solution.txt"): 
      time.sleep(10) 
      os.system('taskkill /im menu.exe') 
+0

Вы можете использовать 'Popen.pid', чтобы получить идентификатор процесса подпроцесса, который вы породили. Затем вы можете вызвать 'kill -0 PID' (если вы используете Windows, проверьте, как' kill' ведет себя там!) В цикле, пока не будет возвращено значение 0 или 'None'. – rbaleksandar

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

  • Нет связанных вопросов^_^