导入后python模块子文件夹不可用

时间:2018-09-19 11:59:08

标签: python module package

我已经编写了一些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__文件中添加一些内容吗?

1 个答案:

答案 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/area2/__init__.py和mylib/area1/group11.py中进行相同的操作>

有关更多详细信息: