Я пытаюсь открыть дочерний процесс второго скрипта python в приведенной ниже функции. Кажется, что процесс прекрасен, но когда я пытаюсь закончить процесс, родительский процесс завершается, и дочерний процесс сохраняется. Какие-нибудь рекомендации относительно того, почему это может произойти?.kill() в подпроцессе python убивает родительский, а не дочерний процесс
def thermostat(input):
global ThermostatRunning
global proc
print("Thermostat Function input: %s" % input)
if input == 'stop' and ThermostatRunning == 1:
print("test")
proc.kill()
print proc.poll()
dev2(0) #ensure heater is off
return('Thermostat turned off')
elif input=='stop' and ThermostatRunning == 0:
status = "Thermostat already stopped"
print(status)
return(status)
if input.isdigit() == 0:
return("Thermostat input is not a number or -stop-")
if ThermostatRunning == 1:
print("test2")
proc.kill()
print("test3")
proc = subprocess.Popen('python thermostat.py -t %s' % input, shell=True)#, preexec_fn=os.setsid)
ThermostatRunning = 1
#for line in proc.stdout.readlines():
#print (line)
status = "Thermostat started with set temperature: %s" % input
print(status)
return(status)
Единственная проблема, которая может быть уместной, заключается в том, что это сценарий с флягой. Я не уверен, что это что-то изменит.
как вы называете эту функцию точно (от отдельного модуля, класса, файла и т.д.?). В общем, я бы рекомендовал поместить это в класс и попытаться избежать использования глобалов, хотя я не уверен, связано ли это с проблемой, с которой вы столкнулись. –
Я звоню из другой функции в том же файле. Я довольно новичок в python и не имею большого опыта работы с классами. – brett
Является ли 'python термостат.py' заполнитель для какого-то другого процесса? Иначе зачем вам 'shell = True'? 'Popen ([sys.executable или 'python', '-mthermostat', '-t', input])' должен работать без оболочки. Вам нужно, чтобы это был отдельный процесс? Вы пробовали 'из термостата импортировать some_function; some_function (вход) '? – jfs