Как убить процесс запущенный через subprocess?
Пишу программу которая запускает и останавливает скрипт Python через другой скрипт Python по просьбе пользователя. И написал следующий код:
import subprocess
from subprocess import Popen
from subprocess import check_output
import psutil
def Start():
Text = input("Введите 'Старт' или 'Стоп': ")
if Text == "Старт":
proc = subprocess.Popen([sys.executable, 'Script.py'])
elif Text == "Стоп":
proc.kill()
while True:
Start()
Но мне выводит ошибку когда пытаюсь остановить процесс.
Traceback (most recent call last):
File "C:\Users\User\main.py", line 39, in Start
killprocess("BOT_VK_ExCase3D.py")
File "C:\Users\User\main.py", line 23, in killprocess
pid = get_pid(name)
File "C:\Users\User\main.py", line 20, in get_pid
return map(int, check_output(["pidof", name]).split())
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 411, in check_output
**kwargs).stdout
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 488, in run
with Popen(*popenargs, **kwargs) as process:
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 800, in __init__
restore_signals, start_new_session)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 1207, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] ═"непонятные символы"
Вопрос: Что я делаю не так и как это исправить?
Ответы (2 шт):
proc = None
def Start():
global proc
Text = input("Введите 'Старт' или 'Стоп': ")
if Text == "Старт":
proc = subprocess.Popen([sys.executable, 'Script.py'])
elif Text == "Стоп" and proc:
proc.kill()
Небольшое уточнение (это не столько для вас, столько для тех, кто будет искать решение похожей проблемы в других условиях) - смотря откуда была запущена программа с помощью subprocess. Просто сам столкнулся с таким случаем, что у меня программу запускает функция через нажатие на кнопку на сайте. Соответственно, она, раз отработав, выключается. А программа продолжает жить и работать своим чередом. Тогда наиболее простой вариант - это привязать работу программы к какому-либо cfg-файлу, на который можно влиять извне. Программа будет проверять время от времени значение переменной "OnProcess", и если оно равно "0", то будет завершаться (лучше всего через sys.exit()). И вот путем влияния на этот файл можно управлять работой программы.