导入信号时未绑定的局部变量错误?

时间:2014-01-13 11:59:16

标签: python

我在文件开头导入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)

2 个答案:

答案 0 :(得分:3)

在函数中导入名称​​也是一项作业;基本上你的样本可以进一步减少到这个:

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

    os.kill(pid, signal.SIGKILL)

这使signal成为函数中的局部变量,Python不会查找全局名称。

import signal行使signal成为本地名称,但由于该行永远不会被执行,因此永远不会绑定signal并抛出异常。

从函数中删除所有 import signal行,或者将其移出条件以无条件地导入(因此始终绑定signal)。

答案 1 :(得分: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)
  • 它基本相同,但附加了标识符。