【问题标题】:Splitting python codebase with single package用单个包拆分 python 代码库
【发布时间】:2017-10-23 18:21:30
【问题描述】:

我有一些由服务器、客户端和公共代码组成的 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 中。

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

【问题讨论】:

    标签: python setuptools python-packaging


    【解决方案1】:

    你应该把pkg 做成一个命名空间包

    虽然官方推荐基于pkgutil的第一种方法,但是基于setuptools&pkg_resources的第二种方法被广泛使用(由于历史原因),如果你注入到其他现有的遗留命名空间中,则需要图书馆。

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

    __import__('pkg_resources').declare_namespace(__name__)
    

    setup.py 中声明它们:

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

    完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 2020-01-10
      相关资源
      最近更新 更多