2015-06-15 2 views
0

У меня есть сценарий (упрощенный ниже), который инициирует другой процесс python. Я знаю имя процесса и PID для текущего и дочернего процессов.Python - завершение дочернего процесса или PID?

Когда я пытаюсь завершить дочерний процесс - пункт меню (2) - я получаю сообщение «локальная переменная py_process», на которую ссылаются перед назначением ».

Предложения о прекращении этого процесса? Является ли это проблемой с переменным охватом?

EDIT: Определено «py_process» как глобальный var внутри exec_menu(). :-)

#!/usr/bin/env python 

import os, sys 
import subprocess 

## Path Variables ## 
pyTivoPath="c:\pyTivo\pyTivo.py" 

def clear_screen(): 
    os.system('cls' if os.name == 'nt' else 'clear') 

## Main Menu ## 
def main_menu(): 
    print "\nmyPID: %d\n" % (os.getpid()) 
    print "1. Start pyTivo" 
    print "2. Stop pyTivo" 
    choice=raw_input ("\nSelect: ") 
    exec_menu(choice) 
    return 

## Menu Action ## 
def exec_menu(choice): 
    gobal py_process 
    if choice=="1": 
     print "\nStarting pyTivo..." 
     from subprocess import Popen, PIPE, STDOUT 
     py_process = subprocess.Popen(pyTivoPath, shell=True, stdout=PIPE, stderr=subprocess.STDOUT) 
     newPID=py_process.pid 
     print "newPID: %d" % (newPID) 
    elif choice=="2": 
     print "stopping pyTivo" 
     py_process.terminate() 
    else: 
     exit() 
    return 

## Main Loop ## 
main_menu() 

raw_input("\nPress Enter to continue...") 
main_menu() 

ответ

1

Да, это переменная проблема.

py_process не существует при последующих вызовах exec_menu (после того, как вы установили его в choice=='1').

Сделать глобальным, а затем он будет доступен, когда вы хотите остановиться.

+1

Спасибо, Кевин, вот что я подумал. Но моя первоначальная попытка состояла в том, чтобы объявить глобальный var извне exec_menu, что не помогло. Я не был уверен, что был на правильном пути до вашего ответа. Я переместил Global внутри exec_menu, и все довольны. - благодаря! –

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