2010-03-24 62 views
3

我試圖用Python來加快速度,嘗試用它替換一些C。我遇到了模塊之間共享數據的問題,或者更可能是我對整個事物的理解。我有一個簡單的信號模塊:需要了解Python信號和模塊

import sys, signal 

sigterm_caught = False 

def SignalHandler(signum, stackframe): 
    if signum == signal.SIGTERM: 
    sigterm_caught = True 
    sys.stdout.write("SIGTERM caught\n") 

def SignalSetup(): 
    signal.signal(signal.SIGTERM, SignalHandler) 

,我的主要代碼有這樣一個循環:

signals.SignalSetup() 
while signals.sigterm_caught == False: 
    sys.stdout.write("sigterm_caught=%s\n" % str(signals.sigterm_caught)) 
    time.sleep(5) 

我運行它,然後殺死進程,裏面signals.py它得到的信號,將sigterm_caught設置爲True,但主進程中的循環沒有看到sigterm_caught值的變化。

所以(一)是我的方法完全錯誤的Python方式? (b)我在嘗試引用模塊中的變量時做錯了什麼? (c)我是否應該以不同的方式處理信號,例如引發異常?

此外: 通過引發異常來處理信號還是我的舊C方法仍然是有效的?

回答

7

你需要一個global語句添加到處理程序:

def SignalHandler(signum, stackframe): 
    global sigterm_caught 
    if signum == signal.SIGTERM: 
    sigterm_caught = True 
    sys.stdout.write("SIGTERM caught\n") 

Python的編譯器,默認情況下,認爲每一個名稱(如sigterm_caught)是當地的功能,如果它似乎分配功能名字; global語句的作用是反轉此默認值,以便Python編譯器將該名稱視爲全局(即模塊級別的頂級名稱)。

+0

工程。謝謝。我最好重新閱讀一下Python範圍。 – codebunny 2010-03-24 15:12:08

+0

通過引發異常來處理信號還是全局變量方法仍然有效? – codebunny 2010-03-24 15:17:30

+1

@codebunny,你唯一應該「異步」引發的異常(即來自與正在運行的代碼無關的外部原因)是'KeyboardInterrupt';通過這個例外(或其子類)彙集所有信號是一種可能性,但恕我直言,在可行的情況下,您的替代方案更可取(意見可能不同;-)。 – 2010-03-24 15:35:57

3

如果你是寫作到一個全局變量,使用全局:

sigterm_caught = False 

def SignalHandler(signum, stackframe): 
    global sigterm_caught 
    if signum == signal.SIGTERM: 
    sigterm_caught = True 
    sys.stdout.write("SIGTERM caught\n") 
+0

這將在課堂上工作嗎?在__init__中給出'global self.variable'後,我無法通過其他方法中的信號處理程序訪問設置爲self.variable的值。 – Vivek 2012-05-17 12:44:38