无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
相关产品推荐
相关产品推荐

