2015-02-16 3 views
3

Как я могу убить процесс в Windows?Как убить подпроцесс python в windows

Я начинаю процесс с

self.p = Process(target=self.GameInitialize, args=(testProcess,)) 
    self.p.start() 

Я попытался

self.p.kill() 
self.p.terminate() 
os.kill(self.p.pid, -1) 
os.killpg(self.p.pid, signal.SIGTERM) # Send the signal to all the process groups 

Ошибки

Process Object has no Attribute kill 
Process Object has no Attribute terminate 
Access Denied 

Я не могу использовать .join.

+1

[os.kill] (HTTPS : //docs.python.org/3/library/os.html#os.kill) должно быть достаточно. –

+0

Какой второй аргумент? сигнал не определен. – marsh

+0

os.kill (self.p.pid, -1) возвращает доступ отрицательно – marsh

ответ

2

на окнах, os.killpg не будет работать, потому что он отправляет сигнал на идентификатор процесса для завершения. Вот как вы убиваете процесс в Windows, вместо этого вы должны использовать TerminateProcess API win32, чтобы убить процесс.

Таким образом, вы можете убить процесс следующим на окнах:

import signal 
os.kill(self.p.pid, signal.CTRL_C_EVENT) 

Если выше не работает, то попробуйте signal.CTRL_BREAK_EVENT вместо этого.

2

Вы должны предоставить минимальный рабочий пример проблемы, с которой вы сталкиваетесь. Как показано ниже, этот минимальный рабочий пример корректно завершает процесс (протестирован на Python 2.7.5 64-bit), поэтому ошибка, которую вы видите, находится в коде, который вы не показывали.

import multiprocessing as mp 
import time 

def work(): 
    while True: 
     print('work process') 
     time.sleep(.5) 

if __name__ == '__main__': 
    p = mp.Process(target=work) 
    p.start() 
    for i in range(3): 
     print('main process') 
     time.sleep(1) 
    p.terminate() 
    for i in range(3): 
     print('main process') 
     time.sleep(.5) 

Выход:

main process 
work process 
work process 
main process 
work process 
work process 
main process 
work process 
work process 
main process 
main process 
main process 
0

Я должен был сделать это с помощью этого метода from this link:

subprocess.call(['taskkill', '/F', '/T', '/PID', str(self._active_process.pid)]) 

Это потому, что self._active_process.kill() не была адекватной