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

添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:43:15