【发布时间】:2017-05-28 00:42:56
【问题描述】:
命名空间包的话题对于外行来说似乎有点混乱,而且以前版本的 Python 已经以几种不同的方式实现它或者 StackOverflow 上的很多问答都过时了,这无济于事。我正在 Python 3.5 或更高版本中寻找解决方案。
场景:
我正在将一堆 Python 代码重构为模块和子模块,并努力将这些项目中的每一个设置为在同一个命名空间中相互独立运行。
我们最终将使用内部 PyPi 服务器,将这些包提供给我们的内部网络,并且不想将它们与外部(公共)PyPi 包混淆。
示例:我有 2 个模块,我希望能够执行以下操作:
from org.client.client1 import mod1
from org.common import config
反射的模块将是分开的:
存储库 1:
org_client_client1_mod1/
setup.py
mod1/
__init__.py
somefile.py
存储库 2:
org_common_config/
setup.py
config/
__init__.py
someotherfile.py
我的 Git 存储库已经设置为 org_client_client1_mod1 和 org_common_config,所以我只需要对打包和 __init__.py 文件执行设置,我相信。
问题:
#1
对于
__init__.py,我应该使用哪一个(如果有的话)?:from pkgutil import extend_path __path__ = extend_path(__path__, __name__)或者:
import pkg_resources pkg_resources.declare_namespace(__name__)
#2
使用
setup.py,是否还需要添加namespace_modules参数,如果需要,是否使用namespace_modules=['org.common'], 或namespace_modules=['org', 'common']?
#3
我可以通过以某种不同的方式实现这一点来放弃上述所有内容吗?也许更简单或更“pythonic”的东西?
【问题讨论】:
-
我不太了解存储库或 setup.py,但我可以说you probably shouldn't be using an
__init__.pyat all if you're on 3.5+。 -
是的,我阅读了 PEP420,它似乎确实增加了我的困惑。它谈到了方法,然后说你不需要这样做,因为你可以将它添加到
setup.py。 -
嘿@Bobby,你会考虑接受答案吗? Rite's one 很完整,似乎解决了你的疑惑
标签: python python-3.x setuptools pypi namespace-package