我已经编写了一些python脚本,现在我想将它们打包在一个模块中。这个想法是创建一些文件夹以更好地组织它们。
结构是这样的
mylib
__init__.py
area1
__init__.py
group11.py
area2
__init__.py
group12.py
__init__.py
文件仅包含__all__
变量。顶层是__all__ = ["area1", "area2"]
,其他顶层是__all__ = ["group11"]
,假设group11.py
包含我要调用的功能def test():
。
安装软件包后,我将得到以下结果
import mylib # --> ok
mylib.area1.group11.test() # --> module 'mylib' has no attribute 'area1'
import mylib.area1.group # --> ok
mylib.area1.group11.test() # --> ok
from mylib.area1 import group11 # --> ok
group11.test() # --> ok
为什么第一个解决方案不起作用?我应该在__all__
文件中添加一些内容吗?
答案 0 :(得分:0)
这是完全正常的。
您没有在area1
包中定义符号mylib
,因此出现错误。
选项1
一种解决方案是从您的子包中导出所有符号,如下所示:
from . import area1
选项2
另一种可行的方法也应该至少在包装中导入该符号,即
# mylib/area1/group11.py
def test():
print 'hello'
# mylib/__init__.py
from area1.group11 import test
import mylib
mylib.test() # OK
import mylib.area1.group11
mylib.area1.group11.test() # OK
但是,由于符号test
是在mylib.area1.group11
中定义的,因此您只能通过 导入mylib
来访问子包和模块在其中。
我要说的是,当您执行import mylib
时,您将导入mylib/__init__.py
中定义的符号,而不是子包或子模块。您还必须导入它们。
警告:如果要“导出” /定义mylib/area1/__init__.py
mylib/area1/group11.py
中进行相同的操作>
有关更多详细信息: