gpt4 book ai didi

python - 深度嵌套的命名空间包

转载 作者:行者123 更新时间:2023-12-01 00:32:21 25 4
gpt4 key购买 nike

我需要维护一些以这样的方式构建的 ETL 工具,任务和管道被定义为 python 包的集合。考虑一下具有小核心和嵌套命名空间/包/子包中近千个插件的插件架构。这还不是一团糟,整体质量相当不错,但 setup.py 和 __init__.py-s 看起来很老套,有时在导入过程中导致意外问题。

我想稍微简化一下。从 Python 3.3 开始,我们只需创建子目录即可将包放入命名空间中,而无需使用 __init__.py。这正是我所需要的,但我想避免源代码中深层嵌套的子目录,因为大量的包非常小。在极端情况下,它们看起来像这样:

$ 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

我想要这样的结构:

$ tree
.
├── setup.cfg
├── setup.py
└── src
└── package
├── actual_code.py
└── __init__.py

但安装过程应将package放入foo/bar/baz/xyz/uvw/package文件夹中,以便可以使用完整路径导入。

编辑:这是个好主意吗?

最佳答案

这可以使用package_dir来实现distutils.core.setup 的参数(或 setuptools 中的同等内容)。

只需修改您的 setup.py包含类似的内容:

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等价的是:

[options]
package_dir=
foo.bar.baz.xyz.uvw=src
packages = foo.bar.baz.xyz.uvw.package

关于python - 深度嵌套的命名空间包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58085539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com