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