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

setup.py执行bdist_rpm时报No module named 'src.version'如何解决

问题原因

报错是bdist_rpm构建环境的路径结构和本地项目路径不一致导致的,核心是你的配置存在冲突:

  • 本地运行python3 setup.py --version时,项目根目录存在src文件夹,Python可以正常找到src.version模块,所以运行正常。
  • 你在setup.py中配置了package_dir={'':'src'},这个配置会告诉setuptools:打包时将src目录下的文件直接作为包根内容,不需要保留src目录本身。执行bdist_rpm构建时,生成的临时构建目录下只会有原src里的文件,不会保留src文件夹,此时构建流程运行setup.py时找不到src模块,就会抛出ModuleNotFoundError。
解决方案

以下几种方案都可以解决问题,按需选择即可:

方案1:直接读取版本文件(最推荐,无路径依赖)

修改setup.py,不用导入模块的方式获取版本号,直接读取version.py解析版本值,避免对src模块的导入依赖:

#!/usr/bin/python
from setuptools import setup

# 直接读取version.py获取版本号,无需导入模块
with open("src/version.py", "r", encoding="utf-8") as f:
    version_vars = {}
    exec(f.read(), version_vars)
    __version__ = version_vars["__version__"]

setup(
    name='tankduels',
    version=__version__,
    description='Console game',
    package_dir={'':'src'},
    entry_points={"console_scripts": ["tankduels = tankduels:main"]},
)

方案2:调整配置保留src命名空间

如果你希望保留src作为包的命名空间,修改setup.py的打包配置:

#!/usr/bin/python
from setuptools import setup
from src.version import __version__

setup(
    name='tankduels',
    version=__version__,
    description='Console game',
    packages=['src'], # 声明需要打包src目录作为包
    # 删除原来的package_dir={'':'src'}配置
    entry_points={"console_scripts": ["tankduels = src.tankduels:main"]}, # 入口函数路径同步修改
)

这个方案安装后,导入包需要用import src.xxx的格式,构建时会保留src目录,导入src.version不会报错。

方案3:移动version.py到项目根目录

如果不想修改现有打包逻辑,把version.py从src目录移动到和setup.py同级的项目根目录,然后将setup.py里的导入语句改为from version import __version__即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:24:04