【发布时间】:2019-09-24 17:33:11
【问题描述】:
我需要维护一些以这种方式构建的 ETL 工具,将任务和管道定义为 python 包的集合。考虑具有小核心的插件架构和嵌套命名空间/包/子包中的近千个插件。这还不是一团糟还,整体质量相当不错,但setup.py 和__init__.py-s 看起来很hacky,有时在导入过程中会导致意想不到的问题。
我想稍微简化一下。从 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文件夹中,这样就可以用完整路径导入了。
编辑:这是个好主意吗?
【问题讨论】:
-
您是否考虑过指定
__all__? example -
这不是为了缩短长期进口。我需要在安装后拥有那个深层结构,但我不希望它在源代码存储库中。
标签: python setuptools packaging