Ответ 1
Вы вызываете os.kill в процессе pid.
os.kill(process.pid, signal.SIGKILL)
Вы в порядке, потому что вы работаете в Linux. Пользователям Windows не повезло.
Я использую пакет подпроцессов в Python для запуска подпроцесса, который мне позже нужно убить. Однако в документации пакета подпроцессов указано, что функция terminate() доступна только из 2.6
Мы используем Linux с 2.5 и для обратной совместимости, я не могу перейти на 2.6, что альтернатива? Я предполагаю, что эти функции удобны для чего-то.
Вы вызываете os.kill в процессе pid.
os.kill(process.pid, signal.SIGKILL)
Вы в порядке, потому что вы работаете в Linux. Пользователям Windows не повезло.
Чтобы завершить ответ @Gareth, в Windows вы выполните:
import ctypes
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, theprocess.pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)
не такой элегантный, как os.kill(theprocess.pid, 9)
, но он работает; -)
Чтобы выполнить ответы @Gareth и @Alex, если вы не хотите беспокоиться о системе подкладки, вы можете использовать psutil.
psutil - это модуль, обеспечивающий интерфейс для извлечения информации о запущенных процессах и системе использования (CPU, память) в переносным способом с помощью Python, реализация многих функций предлагаемые инструментами командной строки, такими как ps, top, kill и диспетчер задач Windows.
В настоящее время он поддерживает Linux, OS X, FreeBSD и Windows с Python версии от 2.4 до 3.1, используя уникальная база кода.
Это окончательное решение для копирования & pase:
def terminate_process(pid):
# all this shit is because we are stuck with Python 2.5 and
# we cannot use Popen.terminate()
if sys.platform == 'win32':
import ctypes
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)
else:
os.kill(pid, signal.SIGKILL)
Принятие отчетов об ошибках в виде комментариев;)