导入__init__.py中包中使用的模块

时间:2016-09-07 10:32:07

标签: python

我有以下目录结构:

funniest/
    setup.py
    funniest/ 
          __init__.py
          ModuleA.py
          ModuleB.py
# __init__.py
from numba import jit

from .ModuleA import ClassA
# ModuleA.py
import funniest.ModuleB

class ClassA():
    pass
# ModuleB.py
@jit
def f():
    pass

但是,导入模块时,收到错误消息:

>>> import funniest
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/domi89/Dropbox/Python_Projects/funniest/funniest  /__init__.py", line 2, in <module>
from .ModuleA import ClassA
File "/home/domi89/Dropbox/Python_Projects/funniest/funniest /ModuleA.py", line 1, in <module>
import funniest.ModuleB
File "/home/domi89/Dropbox/Python_Projects/funniest/funniest/ModuleB.py", line 1, in <module>
@jit
NameError: name 'jit' is not defined

我无法理解为什么会发生这种情况,因为首先执行__init__.py时,首先要做的是导入from numba import jit。那么,为什么jitf中的ModuleB函数中没有定义?

2 个答案:

答案 0 :(得分:6)

您在funniest/__init__.py中输入的导入仅在您执行import funniest时导入,而不是在子模块中自动导入。因此ModuleB不了解jit

您需要做的是将from numba import jit__init__.py移至ModuleB.py

答案 1 :(得分:3)

ModuleB内部未知名称import。 Python导入不像C / C ++那样工作,代替import funniest推出代码。一个新模块创建一个新的命名空间,里面有一个地图 - 一个包含函数,类等的地图。

因此,当您执行{..., funniest: {}, ...}时,您在当前命名空间中创建了新的地图条目,例如:funniest。导入jit后,您导入了ClassAfunniest,因此从导入funniest: {jit: {..}, ClassA: {...}}模块的位置开始,您可以访问此类地图:ModuleA

在导入ModuleB的{​​{1}}中,因此在ModuleA中,您有一个内容为ModuleB:{...}的新变量ModuleB。但是在这里你没有看到funniest地图 - 它在层次结构的其他层面。

ModuleB中,您看不到funniestClassA地图(名称空间 - 以及您喜欢称之为的内容;)。)