Подтвердить что ты не робот

В Python 2.5 как убить подпроцесс?

Я использую пакет подпроцессов в Python для запуска подпроцесса, который мне позже нужно убить. Однако в документации пакета подпроцессов указано, что функция terminate() доступна только из 2.6

Мы используем Linux с 2.5 и для обратной совместимости, я не могу перейти на 2.6, что альтернатива? Я предполагаю, что эти функции удобны для чего-то.

4b9b3361

Ответ 1

Вы вызываете os.kill в процессе pid.

os.kill(process.pid, signal.SIGKILL)

Вы в порядке, потому что вы работаете в Linux. Пользователям Windows не повезло.

Ответ 2

Чтобы завершить ответ @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), но он работает; -)

Ответ 3

Чтобы выполнить ответы @Gareth и @Alex, если вы не хотите беспокоиться о системе подкладки, вы можете использовать psutil.

psutil - это модуль, обеспечивающий интерфейс для извлечения информации о запущенных процессах и системе использования (CPU, память) в переносным способом с помощью Python, реализация многих функций предлагаемые инструментами командной строки, такими как ps, top, kill и диспетчер задач Windows.

В настоящее время он поддерживает Linux, OS X, FreeBSD и Windows с Python версии от 2.4 до 3.1, используя уникальная база кода.

Ответ 4

Это окончательное решение для копирования & 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)

Принятие отчетов об ошибках в виде комментариев;)