2009-06-30 15 views
28

Używam pakietu podprocesów w Pythonie do uruchomienia podprocesu, który później muszę zabić. Jednak dokumentacja pakietu podprocesowego stwierdza, że ​​funkcja terminate() jest dostępna tylko od 2.6W Pythonie 2.5, w jaki sposób mogę zabić podproces?

Używamy Linuxa z wersją 2.5 i ze względu na kompatybilność wsteczną Nie mogę uaktualnić do wersji 2.6, jaka jest alternatywa? Zgaduję, że te funkcje są wygodnymi metodami dla czegoś.

+1

cool: Gdybym skleić razem otrzymuję odpowiedź 'przenośny' kod! – Blauohr

+1

Istnieje już sklejona przenośna odpowiedź http://stackoverflow.com/a/8536476/192632 – bogdan

Odpowiedz

40

Wywołujesz os.kill na pidzie procesu.

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

Jesteś OK, ponieważ masz włączony system Linux. Użytkownicy systemu Windows mają pecha.

+3

os.kill (p.pid, signal.SIGTERM), aby być bardziej precyzyjnym –

+1

"kill 123" wysyła SIGTERM. "kill -9 123" wysyła SIGKILL. Bądź miły dla procesu i spróbuj najpierw SIGTERM. – Jabba

40

Aby zakończyć @ odpowiedź Garetha, Windows zrobić:

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) 
nie

aż tak elegancki jak os.kill(theprocess.pid, 9), ale działa ;-)

6

W celu zakończenia @ Gareth i odpowiedzi @Alex , jeśli nie chcesz zawracać sobie głowy systemem podkładania, możesz użyć psutil.

psutil to moduł zapewniając interfejs do pobierania informacji na procesy i układ utylizacja (procesor, pamięć), w przenośny sposób działa przy użyciu Python, realizacji wielu funkcji oferowanych przez narzędzia wiersza poleceń, takich jak ps, menedżer zadań top, kill i Windows.

Obecnie obsługuje Linux, OS X, FreeBSD i Windows z Python wersjach od 2.4 do 3.1 za pomocą unikalną bazę kodu.

4

Ów kopiowania & PASE kompletne rozwiązania:

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) 

Przyjmowanie zgłoszeń błędów jak komentarzach;)

Powiązane problemy