python - 如何在 PyPi 中的某个根包下组织我的包?

标签 python pip distutils

我有几个或多或少独立的包(请参阅下面的 apack 和 bpack)。我想让它们都像这样可用:

import mycompany.apack.somemodule
import mycompany.bpack.somemodule

由于它们是独立的,因此我为每个文件都有单独的 setup.py 以将它们部署到 PyPi,因此发布周期也不同。

这里有一个问题:是否可以有根包的子包,并具有单独的发布过程(每个子包都有自己的setup.py)?如何实现这一目标?

这是我尝试过的方法,但无法使其正常工作。 我当前的 setup.py 如下所示:

from distutils.core import setup
setup(
    name='mycompany-apack',
    version='0.1',
    packages=['mycompany.apack'],
    license='GPLv3')

这些 setup.py 在 dist-packages 文件夹中创建以下结构:

mycompany
  apack
    __init__.py
    somemodule.py
  bpack
    __init__.py
    somemodule.py

现在,由于我的 mycompany 没有 __ init __.py (这是我的猜测),我收到以下错误:

>>> import mycompany.apack.somemodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mycompany.apack.somemodule

最佳答案

简短回答

使用 setuptools 项目中的 pkg_resources.declare_namespace

长答案

您可以使用 setuptools 而不是 distutils。它支持依赖管理和命名空间,

对于 apack,项目结构将如下所示:

/apack/
 |- mycompany/
 |   |- __init__.py (1)
 |   `- apack/
 |       |- __init__.py
 |       `- submodule.py
 `- setup.py

对于 apack,您的 setup.py 将如下所示:

from setuptools import find_packages
from setuptools import setup

setup(
    name='apack',
    version='0.1',
    packages=find_packages())

标记为 (1) 的 __init__.py 将如下所示:

import pkg_resources
pkg_resources.declare_namespace(__name__)

bpack 看起来非常相似,只不过将 apack 替换为 bpack

假设还有一个 cpack,它依赖于 apack 和 bpack。

它看起来很相似,但是 setup.py 看起来像这样:

from setuptools import find_packages
from setuptools import setup

setup(
    name='cpack',
    version='0.1',
    packages=find_packages(),
    install_requires=['apack', 'bpack'])

如果安装了 cpack,apack 和 bpack 也会被安装。 由于命名空间声明,不会发生冲突

$ virtualenv venv
$ source virtualenv/bin/activate
$ pip install cpack
$ python
>>> from mycompany.apack import submodule
>>> from mycompany.bpack import submodule
>>> from mycompany.cpack import submodule

关于python - 如何在 PyPi 中的某个根包下组织我的包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25935118/

相关文章:

python - 如何将控制台脚本/入口点添加到调用类函数 python 的 setup.py

python - 如何更改Python的日期时间格式

python - 创建 virtualenv 时出现错误。该错误说明了有关 python3 的内容

python - 升级到Ubuntu 20.04杀害 pip

python - 如何在 virtualenv 中配置 pip 以将软件包安装到当前目录根目录?

python - Solaris python setuptools 安装

python - 尾递归斐波那契

python - 将子列表截断到最短长度

python - 我固定的 pyOpenSSL 版本 19.0.0 突然坏了

python - 使用 setup.py 安装时未复制 __init__ 模块