python模块子文件夹在imp之后不可用

2024-10-05 14:21:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 模块文件pytestimport脚本文件夹init
1条回答
网友
1楼 · 发布于 2024-10-05 14:21:33

这完全正常。 您没有在mylib包中定义符号area1,因此出现错误

选项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/group11.py导出/定义符号,则必须在mylib/area1/__init__.pymylib/area2/__init__.py中执行相同的操作

有关详细信息:

相关问题 更多 >