首页 > 解决方案 > 导入后python模块子文件夹不可用

问题描述

我已经编写了一些 python 脚本,现在我想将它们打包在一个模块中。这个想法是创建一些文件夹来更好地组织它们。

结构是这样的

mylib
    __init__.py
    area1
        __init__.py
        group11.py
    area2
        __init__.py
        group12.py

这些__init__.py文件仅包含__all__变量。顶层是__all__ = ["area1", "area2"],其他的就像这个__all__ = ["group11"]Assume包含我要调用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__文件中添加一些东西吗?

标签: pythonmodulepackage

解决方案


这是完全正常的。您没有area1mylib包中定义符号,因此出现错误。

选项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__.pymylib/area1/group11.py

更多细节:


推荐阅读