Я пытаюсь запустить с Python сервер для оценки моделей PMML в Java .Как только вычисления сделаны, я хочу иметь возможность закрыть этот сервер (т.е. завершить процесс).Я на Windows 10. Однако я нахожу это более запутанным, чем я думал.
Сначала я запускаю сервер следующим образом:
p = subprocess.Popen('START /B java -jar openscoring-server-executable-1.4.3.jar',
shell=True)
Я делаю этоработать в фоновом режиме, чтобы окно CMD не отображалось при запуске сценария пользователем.Чтобы сделать это возможным, я думаю, что параметр shell=True
необходим.
Когда я пытаюсь завершить процесс, используя следующую строку:
subprocess.call("TASKKILL /F /PID {pid} /T".format(pid=p.pid))
Процесс все еще выполняется.Фактически, PID, который возвращает p.pid
, даже не существует в диспетчере задач.Я подтвердил это при попытке использовать решение, предоставленное в этом ответе :
def kill(proc_pid):
process = psutil.Process(proc_pid)
for proc in process.children(recursive=True):
proc.kill()
process.kill()
kill(p.pid)
Это возвращает исключение NoSuchProcess: no process found with pid 5280
.
, которое я вижу черезДиспетчер задач - PID, назначенный процессу, который я хочу уничтожить:
Но я не знаю, как найти этот PID в Python, чтобы завершить его,Ответы, которые я нашел на сайте, похоже, не работают с процессами, работающими в фоновом режиме.
РЕДАКТИРОВАТЬ:
Я думаю, что это можно решить, если я смог запустить командус shell=False
, но я не знаю, как это сделать из-за START /B
.Это возвращает ошибку:
p = subprocess.Popen(['START', '/B', 'java', '-jar openscoring-server-executable-1.4.3.jar'])