我正在将我们公司正在开发的 python 库重组为不同的组。为避免污染顶级模块命名空间,我想将所有内容分组在顶级“companyname”包下,因此我们将拥有“conname.utils”、“conname.qa”、“conname.api”等. 其中一些预计将与我们的产品一起分发,或可公开安装。'qa' 将纯粹是内部的。
谷歌做了类似的事情。例如,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 是合理的。