我正在尝试创建一个简单的多级包:
test_levels.py
level1/
__init__.py (empty file)
level2/
__init__.py (only contents: __all__ = ["leaf"])
leaf.py
leaf.py:
class Leaf(object):
print("read Leaf class")
pass
if __name__ == "__main__":
x = Leaf()
print("done")
test_levels.py:
from level1.level2 import *
x = Leaf()
运行leaf.py可以正常工作,但运行test_levels.py会返回下面的输出, 我期待没有输出的地方:
read Leaf class
Traceback (most recent call last):
File "C:\Dev\intranet\test_levels.py", line 2, in <module>
x = Leaf()
NameError: name 'Leaf' is not defined
有人可以指出我做错了吗?
答案 0 :(得分:0)
尝试添加
from leaf import *
在文件level1 / level2 / __ init __。py
中upd:与之前的注释一样,在模块名称前添加点,并删除“__all__”声明。
$ cat level1/level2/__init__.py
from .leaf import Leaf
$ cat level1/level2/leaf.py
class Leaf:
def __init__(self):
print("hello")
$ cat test.py
from level1.level2 import *
x = Leaf()
$ python test.py
hello
答案 1 :(得分:0)
在level1/level2/__init__.py
中,我认为您想要from leaf import *
(或者在Py3k中,from .leaf import *
)。
从level1.level2
导入时,您实际上是在该目录中导入__init__.py
文件。由于您尚未在其中定义Leaf
,因此您无法通过导入它来获取它。
答案 2 :(得分:0)
您是否希望从该包中的所有模块导入所有变量名称?这是一个可怕的想法。要做你想做的事,应该是
from level1.level2.leaf import *
甚至更好的是删除通配符导入,这通常很糟糕,应该是
from level1.level2.leaf import Leaf