首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >深度嵌套命名空间包

深度嵌套命名空间包
EN

Stack Overflow用户
提问于 2019-09-24 17:33:11
回答 1查看 823关注 0票数 2

我需要维护一些以这样的方式构造的ETL工具,任务和管道被定义为python包的集合。考虑一下内核小的插件体系结构,以及嵌套名称空间/包/子包中的几乎上千个插件。这还不是什么大麻烦,总体质量还不错,但是setup.py__init__.py-s看上去很麻烦,有时会在导入过程中引发意想不到的问题。

我想简化一下这个问题。由于Python3.3,我们可以简单地通过创建没有__init__.py的子目录将包放入命名空间。这正是我所需要的,但我希望避免在源代码中进行深度嵌套的子目录,因为大量的包非常小。在极端情况下,它们会是这样的:

代码语言:javascript
复制
$ tree
.
├── setup.cfg
├── setup.py
└── src
    └── foo
        └── bar
            └── baz
                └── xyz
                    └── uvw
                        └── package
                            ├── actual_code.py
                            └── __init__.py

有没有一种方法可以使用隐式命名空间而不需要如此深层次的结构,只需在setup.py中的某个地方指定名称空间(或者更好的setup.cfg)?换句话说,是否有一种简单的方法:在foo.bar.baz.xyz.uvw命名空间中安装package

我想要这样的结构:

代码语言:javascript
复制
$ tree
.
├── setup.cfg
├── setup.py
└── src
    └── package
        ├── actual_code.py
        └── __init__.py

但是安装过程应该将package放入foo/bar/baz/xyz/uvw/package文件夹,这样就可以用完整的路径导入它。

编辑:这是个好主意吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-24 19:31:37

这是可以使用package_dir参数到distutils.core.setup (或与setuptools等效的)。

只需修改setup.py以包含如下内容:

代码语言:javascript
复制
from distutils.core import setup

setup(# ... other setup arguments ...
      package_dir={'foo.bar.baz.xyz.uvw': 'src'},
      packages=['foo.bar.baz.xyz.uvw.package'],
     )

这里的关键部分是package_dir在说“foo.bar.baz.xyz.uvw的内容是src目录中的内容”,而packages=['foo.bar.baz.xyz.uvw.package']告诉它希望找到并安装一个名为foo.bar.baz.xyz.uvw.package的包。

setup.cfg的等价物是:

代码语言:javascript
复制
[options]
package_dir=
    foo.bar.baz.xyz.uvw=src
packages = foo.bar.baz.xyz.uvw.package
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58085539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档