添加pyproject.toml后,如何让setup.py可导入version.py?
解决方案
问题原因
添加pyproject.toml后,pip和cibuildwheel会启用PEP 517/518规定的隔离构建环境——此时项目根目录不会被自动添加到Python的模块搜索路径,所以setup.py里from version import get_version会找不到模块。
可行方案
方案1:直接在setup.py中执行version.py的代码
不需要复制粘贴函数,而是通过读取文件并执行的方式加载get_version函数,绕开模块导入的问题:
# setup.py 开头 with open('version.py', 'r', encoding='utf-8') as f: exec(f.read()) # 后续直接使用get_version() setup( version=get_version(), # 其他参数... )
这种方式保留了version.py作为唯一的Python端版本解析逻辑入口,避免代码冗余。
方案2:把version.py做成可执行脚本,通过subprocess获取版本
修改version.py,让它在直接运行时输出版本号:
# version.py 末尾添加 if __name__ == '__main__': print(get_version())
然后在setup.py中通过调用脚本获取版本:
# setup.py import subprocess import sys def get_version(): result = subprocess.run( [sys.executable, 'version.py'], capture_output=True, text=True, check=True ) return result.stdout.strip() setup( version=get_version(), # 其他参数... )
这种方式完全隔离了构建环境和项目模块,适合复杂的构建场景。
方案3:将版本解析逻辑封装为独立的构建依赖(进阶)
如果后续有更多工具需要复用版本解析逻辑,可以把version.py的核心逻辑提取成一个极小的构建辅助包,在pyproject.toml的build-system.requires中声明它。但这个方案需要额外维护一个小包,对于你的场景来说可能有点过重,前两个方案更实用。
注意事项
conanfile.py不受影响,因为它不是在隔离构建环境中运行的,依然可以正常import version。- 保持
version.hpp作为唯一的版本源,所有Python端的版本获取都从它解析,避免版本不一致。
内容的提问来源于stack exchange,提问作者rturrado
相关产品推荐
相关产品推荐

