用单个包拆分 python 代码库

Splitting python codebase with single package

我有一些 python 代码,由服务器、客户端和公共代码组成,我试图将它们拆分为共享包名称空间的单独项目。我见过几个类似的问题,但它们似乎指的是独立但名称冲突的包。

我正在尝试制作一个简单的示例

a
├── pkg
│   ├── a.py
│   ├── __init__.py
└── setup.py
b
├── pkg
│   ├── b.py
│   ├── __init__.py
└── setup.py

a/setup.py

import setuptools

setuptools.setup(
    name='pkg_a',
    packages=setuptools.find_packages(),
    entry_points={
        'console_scripts': [
            'pkga=pkg.a:main'
        ]
    }
)

a.py

def main():
    print('Module A')

请注意 b/setup.pyb.py 相同,对 a 的引用更改为 b

如果我在每个目录中执行 pip install .,命令 pkapkgb 都有效,但 import pkg.aimport pkg.b 仅与最后安装的一起工作。 a.pyb.py 以及一个空的 __init__.py 都在 site-packages/pkg.

有什么方法可以让这个设置生效吗?尝试跨包共享包名是个坏主意吗?

你应该使 pkg 成为一个 命名空间包 :

虽然官方推荐基于pkgutil的第一种方法,但基于setuptools & pkg_resources的第二种方法被广泛使用(由于历史原因),如果您需要注入其他库的现有旧命名空间。

对于 setuptools 方式,将此行放入两个库中的 pkg/__init__.py

__import__('pkg_resources').declare_namespace(__name__)

在两者中声明它们 setup.py:

setup(
    # ...
    namespace_packages=['pkg']
)

完成。