python - 导入后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__
文件中添加一些东西吗?
解决方案
这是完全正常的。您没有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
更多细节:
推荐阅读
- python - PyCharm 错误:kivy.garden.knob 导入成功但在脚本上未激活
- c - 带有可变参数的 C printf 说明符。在哪一点上未定义的行为有问题?
- python - 使 SQLAlchemy 错误更加用户友好和详细
- css - -moz-available 高度在 Firefox 中不起作用
- mysql - 创建提供 mysql 数据库的用户联系表单
- google-sheets - 从 A 列获取 B 的同一行中的元素,索引取自 C
- c++ - 使用继承与通过 std::function 公开组合成员的方法
- rcpp - 将函数指针添加到 Parallel Worker
- node.js - 如何从回调中返回变量?
- apache-flink - 如何在 Mesos Flink 集群中实现 JobManager 高可用?