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

