【发布时间】:2016-01-31 12:06:21
【问题描述】:
我正在将我们公司正在开发的 python 库重组为不同的组。为避免污染顶级模块命名空间,我想将所有内容分组在顶级“companyname”包下,因此我们将拥有“conname.utils”、“conname.qa”、“conname.api”等.其中一些预计将与我们的产品一起分发,或可公开安装。 'qa' 将纯粹是内部的。
Google 做了类似的事情。例如,protobuf 库在模块路径中以“google.protobuf”的形式提供。不过不是特别干净:protobuf包安装的.pth文件长这样:
import sys, types, os;p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('google',));ie = os.path.exists(os.path.join(p,'__init__.py'));m = not ie and sys.modules.setdefault('google', types.ModuleType('google'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
我认为这样做是为了欺骗导入引擎,因为“google”目录中没有 __init__.py。但是……不优雅。
有没有完善的方法来实现这一点?我不介意让任何“coname-*”包都需要一个“coname-top”包来获取 __init__.py。我还不确定如何说服 setuptools 将包视为不在模块树的顶部,也不可能从一棵树创建子包。
为了澄清,我特别询问如何设置上述内容,以便例如可以与 coname-api 分开分发和安装 coname-qa。两者都依赖于 coname-tools 是合理的。
【问题讨论】:
标签: python setuptools module-packaging