【问题标题】:python setup.py import subpackage directlypython setup.py 直接导入子包
【发布时间】:2025-12-08 01:10:02
【问题描述】:

考虑以下最小的setup.py 示例。

alpha
├── beta
│   ├── beta.py
│   └── __init__.py
├── gamma
│   ├── theta
│   │   ├── theta.py
│   │   └── __init__.py
│   └── __init__.py
└── setup.py

setup.py 定义为

from setuptools import setup

setup(
    name='alpha',
    author='author',
    packages=[
        'beta',
        'gamma.theta',
    ],
)

然后我使用pip install -e . 进行安装,一切都按预期工作,即我可以执行import betaimport gammafrom gamma import theta

我的问题:是否可以修改setup.py 以便我可以直接导入thetaimport theta 而不必使用from gamma import theta

【问题讨论】:

  • import gamma.theta 怎么样?
  • @reportgunner 这行得通,而且看起来还不错,因为它是一个最小的例子,但是在有更多级别的情况下,我希望能够避免像import gamma.theta.pkg1.pkg2 这样的事情,如果当然有可能。

标签: python setup.py


【解决方案1】:

您可以将模块放在gamma 的级别上,只包含

from gamma.theta.pkg1.pkg2 import *

并称之为pkg2。然后就可以了

import pkg2

我想这会让用户感到非常困惑,我还没有测试过,所以我不确定它如何处理子包的大量导入。

【讨论】:

    【解决方案2】:

    添加package_dir 参数并指定你的包的位置会让你丰富到你想要到达的点:

    from setuptools import setup
    
    setup(
        name='alpha',
        author='author',
        packages=[
            'theta',
        ],
        package_dir={'theta': 'gamma/'}
    )
    

    【讨论】:

    • 我收到ValueError: path gamma/ cannot end with '/'。如果我删除/ 安装成功,但我不能import theta,我必须使用from gamma import thetaimport gamma.theta,这不是我想要的。也许我错过了什么?
    • 是的,也许,我想您可以尝试仅管理theta 的安装,然后继续进行,我已经设法在本地进行了安装。您可以使用 -I 标志安装到 pip,它告诉它 ignore installed,如下所示: pip install -I -e .