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

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

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


person Uri    schedule 30.06.2009    source источник
comment
Круто: если я склею ответы, я получу «переносимый» код!   -  person Blauohr    schedule 30.06.2009
comment
Есть уже приклеенный переносной ответ stackoverflow.com/a/8536476/192632   -  person bogdan    schedule 16.12.2011


Ответы (4)


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

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

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

person Gareth Simpson    schedule 30.06.2009
comment
os.kill (p.pid, signal.SIGTERM), если быть более точным - person Cristian Ciupitu; 30.06.2009
comment
kill 123 отправляет SIGTERM. kill -9 123 отправляет SIGKILL. Относитесь к процессу вежливо и сначала попробуйте SIGTERM. - person Jabba; 09.01.2012

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

person Alex Martelli    schedule 30.06.2009

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

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

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

person ssoler    schedule 22.02.2011

Это полное решение copy & 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)

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

person sorin    schedule 16.12.2011