2013-12-13 2 views
0

Я пытаюсь открыть дочерний процесс второго скрипта 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) 

Единственная проблема, которая может быть уместной, заключается в том, что это сценарий с флягой. Я не уверен, что это что-то изменит.

+0

как вы называете эту функцию точно (от отдельного модуля, класса, файла и т.д.?). В общем, я бы рекомендовал поместить это в класс и попытаться избежать использования глобалов, хотя я не уверен, связано ли это с проблемой, с которой вы столкнулись. –

+0

Я звоню из другой функции в том же файле. Я довольно новичок в python и не имею большого опыта работы с классами. – brett

+0

Является ли 'python термостат.py' заполнитель для какого-то другого процесса? Иначе зачем вам 'shell = True'? 'Popen ([sys.executable или 'python', '-mthermostat', '-t', input])' должен работать без оболочки. Вам нужно, чтобы это был отдельный процесс? Вы пробовали 'из термостата импортировать some_function; some_function (вход) '? – jfs

ответ

0

Когда вы создаете подпроцесс с оболочкой = True, вы фактически создаете процесс, который порождает другой подпроцесс, поэтому, когда вы вызываете proc.kill(), вы только убиваете родительский процесс. Вы хотите сделать свой подпроцесс лидером группы процессов, чтобы вы могли убить их всех сразу.

раскомментируйте setsid в вызове POPEN и убить всю группу процессов так:

os.killpg(proc.pid, signal.SIGTERM) 
+0

Да, это одна из вещей, которые я пытался заставить ее работать, но это, похоже, убивает обоих. Можно ли использовать этот метод, чтобы убить ТОЛЬКО дочерний процесс? Спасибо! – brett

+0

@brett: ты забыл раскомментировать 'setsid'? – jfs

+0

@ J.F.Sebastian no, то есть без объявления. – brett

Смежные вопросы