也许这是不可能的(我更习惯Ruby,这种事情很好)。我正在编写一个库,为 docker-py 提供附加功能,它提供 docker
包,所以你只需import docker
然后您可以访问 docker.Client
等等
因为这似乎是一个合乎逻辑的命名方案,我希望用户使用 import docker.mymodule
拉入我的项目。 ,所以我创建了一个名为 docker
的目录与 __init__.py
,和mymodule.py
里面。
当我尝试访问docker.Client
时,Python看不到,好像我的docker
包已隐藏它:
import docker
import docker.mymodule
docker.Client() # AttributeError: 'module' object has no attribute 'Client'
这可能吗,或者源树之间的所有顶级包名称都必须不同吗?
最佳答案
这只有在 docker
设置为 namespace package 时才可能实现。 (其中 it isn't )。
参见zope.schema
, zope.interface
等命名空间包的示例(zope
是此处的命名空间包)。由于 zope
在 setup.py
中被声明为命名空间包,这意味着 zope
并不引用文件系统,而是由多个包共享的命名空间。这也意味着 import zope
的结果几乎是未定义的 - 它只会导入在导入路径中找到的第一个 zope.*
包的顶级模块。
因此,在处理命名空间包时,您需要使用 import zope.schema
或 from zope import schema
显式导入特定的命名空间包。
不幸的是,命名空间包没有很好的文档记录。正如 @Bakuriu
在评论中指出的,这些资源包含一些有用的信息:
关于python - 在 Python 中重新打开包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24349915/