繁体   English   中英

如何为python包创建嵌套的包空间?

[英]How to create a nested package space for python packages?

我正在将我们公司正在开发的python库进行重组。 为了避免污染顶层模块名称空间,我想将所有内容归入顶层“ companyname”包中,因此我们将使用“ coname.utils”,“ coname.qa”,“ coname.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。 两者都依赖于同名工具是合理的。

  1. 目录a必须是一个包。 添加一个__init__.py文件使其成为一个包,这比从简单目录迈进了一步。

  2. 目录b还必须是a的子包。 添加__init__.py文件。

  3. 目录测试也可能是一个包。 很难说这是否必要。 通常,将Python模块的每个目录都作为正式包是一个好主意。

  4. 为了导入,该程序包需要在sys.path上。 这是从PYTHONPATH环境变量构建的。 默认情况下,已安装的站点软件包和当前工作目录(实际上)是只能找到软件包的两个位置。

这意味着必须安装a,或者您当前的工作目录还必须是a上一级的软件包。

或者,您需要将PYTHONPATH环境变量设置为包含a。

您试图做的是创建一个名称空间包。 您可以使用setuptools完成此操作。

请参阅https://packaging.python.org/guides/packaging-namespace-packages/#pkgutil-style-namespace-packages

设置目录结构如下:

coname-utils/
    setup.py
    coname/
        utils/
            __init__.py
            ...
        ...

coname-qa/
    setup.py
    coname/
        qa/
            __init__.py
            ...
        ...

coname-api/
    setup.py
    coname/
        api/
            __init__.py
            ...
        ...

根据您打算使用哪种工具进行部署,会有一些变化。 您可以查看上面的链接以获取有关此信息的详细信息。

此目录结构隔离了您希望单独安装的名称空间部分。 您还可以分别对不同的子软件包进行版本控制,这对于维护非常有用。 大概您的某些子包之间可能存在依赖关系。 您可以将代码添加到依赖于另一个子包中的api成员的一个子包中,该子包仅存在于该子包的某些版本中。 在setup.py文件中,您可以定义所需版本的依赖项。

有关如何编写setup.py的详细信息,请参见setuptools文档

设置完成后,您应该可以使用setuptools构建项目,并且可以分别安装utils,qa,api等。在环境中安装后,可以使用“ import coname.utils”,“ import”导入它们。 coname.qa”,等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM