You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无setup.py构建Wheel时,如何标记source root以保留导入路径?

解决打包wheel时保留自定义导入路径的问题

给你几个可行的解决办法:

1. 修改包的__init__.py

在src/package-name/__init__.py里手动导入libraries下的模块,把它们提升到包的顶层:

# src/package-name/__init__.py
# 把需要直接导入的模块/方法都列在这里
from .libraries.module_a import func_a, ClassA
from .libraries.module_b import func_b

这样别人安装你的包后,就能用from package-name import func_a或者from package-name.func_a import ...来调用。如果想彻底不用包名前缀,用户自己代码里加from package-name import *就行,但不推荐全局导入,容易引发命名冲突。

2. 配置pyproject.toml的package_dir

在pyproject.toml里添加package_dir映射,把libraries目录和主包目录都设为源码根,同时保留所有文件:

[tool.setuptools]
# 空字符串对应顶层模块,把libraries设为顶层;同时保留原package-name包的路径
package_dir = {"" = "src/package-name/libraries", "package-name" = "src/package-name"}

[tool.setuptools.packages.find]
# 同时扫描主包目录和libraries目录
where = ["src/package-name", "src/package-name/libraries"]

这种方式能让libraries里的模块直接被导入,但要注意如果主包下有和libraries里同名的模块,会出现冲突。

3. 调整项目结构(最推荐)

直接把libraries下的子文件夹移到src/package-name根目录下,改成这样的结构:

-repo-name
    -folder 1
    -folder 2
    -src
       -package-name
           -folder 1
           -build
           -configs
           -folder 2
           -module_a(原libraries下的子文件夹)
           -module_b(原libraries下的子文件夹)
           ...
       -package.egg-info

这样本地和打包后的导入路径完全一致,不用依赖IDE的source root设置,逻辑最清晰,也不会有后续的适配问题。

内容的提问来源于stack exchange,提问作者random23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:20:58