2015-06-15 75 views
0

我有一個腳本(簡化如下),啓動另一個python進程。我知道當前進程和子進程的進程名稱和PID。Python - 終止子進程或PID?

當我試圖終止子進程 - 菜單選項(2) - 我得到消息「分配之前引用的本地變量」py_process「。

建議終止此過程?這是一個變量範圍問題?

編輯:將'py_process'定義爲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

感謝凱文,這就是我的想法。但我最初的嘗試是從外部exec_menu聲明全局變量,這並沒有幫助。在您回覆之前,我不確定我是否在正確的道路上。我把全局移到exec_menu裏面,一切都很開心。 - 謝謝! –