2014-11-06 6 views
2

Я работаю с платформой Windows. Я изучил разные способы запуска внешнего процесса с помощью python. Используя свои собственные примеры, я могу:Завершите внешнюю программу и закройте все ее активные окна с помощью 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: являются входными файлами для моей внешней программы.

Все это работает отлично, но я не могу найти способ завершить процесс, включая его активное окно для любого из этих случаев, без необходимости щелчка по значку закрытия в правом верхнем углу запущенного окна. Однако, если я набираю taskkill/im menu.exe в командной строке, я управляю тем, что ищу.

Есть ли способ получить то же самое с помощью python ?. Просто ищем что-то простое, поскольку я не знаю слишком много Python.

Я попытался с:

os.system("taskkill /im menu.exe") 

но не закрывает окно, которое запускает мой внешнюю программу.

ответ

0

Сохраните список всех идентификаторов процесса, (PID), задач, которые вы запускаете, а затем отправляете им сигнал завершения.

BTW - Использовать с осторожностью - если процесс вы начали уже закончили это PID может быть повторно использован на то, что не принадлежит к вам!

+0

Программа завершается сам по себе, но оставляет окно, которое он запускает открытым. Я не уверен, как это сделать, когда я закрываю его из командной строки, он говорит: SUCESS: Отправил сигнал завершения процессу «menu.exe» с PID 4512. Как отправить этот заказ из python ?. – Sarah

1

Вместо использования оболочки subprocess.call() попробуйте создать экземпляр объекта Popen из модуля подпроцесса. Он работает так же, как и call(), но вместо этого вы получаете объект, который обертывает обработчик процесса низкого уровня из ОС. Эта обертка имеет метод terminate, который должен делать то, что вы ищете.

+0

Я попытался: child = subprocess.Popen (['C: \ mainfolder \ menu.exe', 'C: \ others \ file1.inp', 'C: \ others \ file2.inp'], stdout = subprocess.PIPE) для запуска моей программы и подпроцесса.Popen.terminate (child) для завершения. Однако окно еще не закрывается, плюс я получаю и Access denied error – Sarah

0

попробовать так: н subprocess

import subprocess 
child = subprocess.Popen(['commad','arg1,'arg2'....],stdout=subprocess.PIPE) 
output = child.communicate() # will give you (stdoutdata,stderrdata) 
# if you want to kill this process 
child.kill() # sends SIGKILL signal 
+0

Я пробовал этот код, но мне все равно нужно закрыть запущенное окно вручную. Как только я закрою окно вручную, вы получите child.communicate() и child.kill(). Если я не нажимаю на значок закрытия окна, мой сценарий не идет дальше. Где проблема здесь? – Sarah

+0

попробуйте этот 'import os' then' os.kill (child.pid, 9) ' – Hackaholic

+0

Я думаю, что система не знает, что мой процесс закончен, поэтому он не отвечает ни на один из os.kill или child.kill() или subprocess.terminate(). – Sarah

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

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