我需要维护一些以这样的方式构造的ETL工具,任务和管道被定义为python包的集合。考虑一下内核小的插件体系结构,以及嵌套名称空间/包/子包中的几乎上千个插件。这还不是什么大麻烦,总体质量还不错,但是setup.py和__init__.py-s看上去很麻烦,有时会在导入过程中引发意想不到的问题。
我想简化一下这个问题。由于Python3.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文件夹,这样就可以用完整的路径导入它。
编辑:这是个好主意吗?
发布于 2019-09-24 19:31:37
这是可以使用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.packagehttps://stackoverflow.com/questions/58085539
复制相似问题