如何为Python软件包创建嵌套的包空间?

2024-09-29 23:14:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在重组我们公司正在开发的python库。为了避免污染顶级模块名称空间,我希望将所有内容分组到顶级的“companyname”包中,因此我们将coname.utils公司', 'coname.qa公司', '名称.api'等等。其中一些产品预计将与我们的产品一起发布,或公开安装质量保证将完全是内部的。在

谷歌也做了类似的事情。E、 g.protobuf库的可用性为“谷歌.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”目录中没有u init_uu.py。但是。。。不优雅。在

有没有一种行之有效的方法来实现这一点?我不介意让任何“coname-*”包都需要一个“coname top”包,这样就可以得到u init_uuy.py。我还不确定如何说服setuptools将包视为不在模块树的顶部,也不知道是否可以从一个树创建子包。在

为了澄清这一点,我特别询问如何设置上面的内容,例如,conameqa可以独立于conameapi进行分发和安装。两者都依赖于coname工具是合理的。在


Tags: 模块andpathpy名称内容initos
2条回答
  1. 目录a需要是一个包。添加一个__init__.py文件,使其成为一个包,这是一个简单目录的一个进步。

  2. 目录b也需要是a的子包。添加一个__init__.py文件。

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

  4. 要导入,需要打开包搜索路径;这是从PYTHONPATH环境变量构建的。默认情况下,安装的站点包和当前工作目录(实际上)是唯一可以找到包的地方。

这意味着必须安装,或者,您当前的工作目录也必须是比a高一级的包

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

您要做的是创建一个命名空间包。您可以使用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成员。在设置.py文件可以定义所需的依赖项版本。在

有关如何编写设置.py在

一旦你设置了这个,你应该能够用setuptools来构建你的项目,你可以单独安装utils,qa,api等等。一旦安装在一个环境中,你可以用“import”导入它们coname.utils公司“,”导入coname.qa公司“,等等

相关问题 更多 >

    热门问题