code.interact 和导入/定义的可见性

18

我不太理解Python模块中的导入函数定义可见性

以下是一个简化版的例子:

from scapy.all import *

def getA():
    return 0

def getB():
    return getA() + 1

def getC():
    code.interact(local=locals()) 
    return 3

def main():
    print getA()
    print getB()
    print getC()
    exit()

if __name__ == '__main__':
    main()

现在,一切都顺利进行,直到我到达函数getC并出现了一个命令提示符,许多应该看到的内容不见了

  • getA()getB()不可见
  • 在导入中的Scapy也不可见

为什么会这样?我做错了什么?

2个回答

30

正如我在上面的评论中所写的,解决方案是:

code.interact(local=dict(globals(), **locals())) 

(取自这里


8
你混淆了locals()globals()。在函数作用域中,locals()仅列出在函数内部定义的名称。
请使用globals()代替。
>>> bar = 'baz'
>>> def foo():
...     spam ='eggs'
...     print locals()
...
>>> foo()
{'spam': 'eggs'}
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'foo': <function foo at 0x108a027d0>, '__doc__': None, '__package__': None}

2
好的。我的目的是打开一个命令提示符来检查变量的值并可能手动继续执行。到目前为止,我只有一个大脚本,所以我想这就是为什么locals()有效的原因。谢谢! - Ricky Robinson
3
嗯。如果我执行 code.interact(local=globals()) 命令,所有本地定义都会丢失。有没有办法实现我在上面评论中提到的功能? - Ricky Robinson
4
好的,我会尽力进行翻译。以下是需要翻译的内容:OK,找到了:code.interact(local=dict(globals(), **locals())) https://dev59.com/Ymw05IYBdhLWcg3wkik-#_aOeEYcBWogLw_1bHzZZ这行代码可以在当前命名空间中获取Python交互式控制台。 - Ricky Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接