2014-01-13 63 views
1

我正在導入signal在我的文件開頭。然後我想在函數中使用像這樣:導入信號時未綁定本地變量錯誤?

os.kill(pid, signal.SIGKILL) 

我得到一個錯誤:

UnboundLocalError: local variable 'signal' referenced before assignment. 

如果我不是import signal功能我沒有得到任何這樣的問題裏面,爲什麼會出現這種情況?

編輯:例如代碼

import signal 
def func(): 
    if args.kill: # Never triggered 
     import signal 
     os.kill(int(args.pid), signal.SIGKILL) 
    elif args.name: 
     os.kill(int(args.pid), signal.SIGKILL) 
+1

顯示一些證明問題的正確代碼。 –

+2

你很可能在同一個函數中將**賦給**'signal'。 –

+3

特別是,顯示[最小,完整,有效示例](http://stackoverflow.com/help/mcve)。 – abarnert

回答

3

在函數導入名稱是的指派;基本上你的樣品可以進一步減少到這一點:

def function(arg1, arg2): 
    if False: 
     import signal 

    os.kill(pid, signal.SIGKILL) 

這使得signal在函數中的局部變量和Python不會看的全局名稱。

import signal行使signal爲本地名稱,但由於行永遠不會執行,所以signal永遠不會被綁定,並引發異常。

刪除從函數所有import signal線,或者將其移出條件的要無條件進口(並因此總是結合signal)。

+0

這不是Martijn的情況,這就是爲什麼我不明白,我開玩笑說,你會在3秒內回答,謝謝:)我看到唯一的其他情況下使用的信號是它導入了一個不同的函數來使用操作系統。像我一樣。添加之前我的方式和代碼路徑不會觸發 – Paul

+1

@Paul:然後顯示我們的功能。 – user2357112

+1

@Paul:你的函數中仍然有一個本地名稱'signal';請向我們展示* full *功能。 –

1

你的第二個

import signal 

在功能上的問題。省略它。

它只是一個本地任務:模塊對象將被分配給本地名稱signal

你可以在一個函數中有兩次 - 它是本地兩次,第二個import什麼都不做,或者你可以在函數的頂部有一次,但是一旦深入內部有時執行。

在你的情況下,錯誤將發生if not args.kill。然後,分配不會發生,但本地名稱不會停止存在。

比較這對

import signal as global_signal 
signal = global_signal 
def func(): 
    if args.kill: # Never triggered 
     signal = global_signal 
     os.kill(int(args.pid), signal.SIGKILL) 
    elif args.name: 
     os.kill(int(args.pid), signal.SIGKILL) 
  • 它本質上是相同的,但額外的標識符。
+0

謝謝,我現在明白了 – Paul