运行setup.py生成未指定版本的version.py,如何配置指定版本?附代码片段
解决setup.py生成version.py缺失指定版本的问题
运行setup.py脚本时,生成的version.py文件未包含指定版本信息。请问如何修改配置,使该文件中能正确指定版本?
你的setup.py代码片段:
from setuptools import setup, find_packages from codecs import open from os import path here = path.abspath(path.dirname(__file__)) with open(path.join(here, 'README.md'), encoding='utf-8') as f: long_description = f.read() def parse_requirements(filename): lineiter = (line.strip() for line in open(filename)) return [line for line in...
我来给你几种实用的解决方案,你可以根据自己的需求选择:
方法1:用setuptools-scm自动生成(推荐)
这是最省心的方式,它能从Git标签、提交记录自动生成版本号,还会帮你生成包含版本信息的version.py文件。
步骤很简单:
- 先安装依赖:
pip install setuptools-scm - 修改你的setup.py,添加scm相关配置:
setup( # 保留你原来的name、long_description、packages等配置 use_scm_version={ "write_to": "你的包名/version.py", # 替换成实际的包路径,比如my_project/version.py "write_to_template": '__version__ = "{version}"', # 自定义version.py的内容模板 }, setup_requires=['setuptools-scm'], )
之后运行python setup.py sdist或者pip install .,就会自动在指定路径生成version.py,内容就是类似__version__ = "0.1.0"的版本信息。
方法2:手动指定版本并写入文件
如果不想用第三方库,也可以手动在setup.py里定义版本,然后直接写入version.py:
修改你的setup.py,添加这些代码:
# 先定义你的版本号 MY_VERSION = "0.1.0" # 写入version.py文件,记得替换成你的包路径 with open(path.join(here, '你的包名', 'version.py'), 'w', encoding='utf-8') as f: f.write(f'__version__ = "{MY_VERSION}"\n') setup( name='你的包名', version=MY_VERSION, # 同时在setup里指定版本,保证一致性 # 其他原有配置... )
这样每次运行setup.py时,都会自动生成包含指定版本的version.py文件。
方法3:无需生成version.py,直接读取版本
如果其实你不需要生成version.py文件,只是想在代码里获取版本号,也可以用这种方式:
在你的包的__init__.py里添加这段代码:
from pkg_resources import get_distribution, DistributionNotFound try: __version__ = get_distribution('你的包名').version except DistributionNotFound: # 如果包还没安装,就显示unknown __version__ = "unknown"
这种方式不需要生成额外的version.py文件,只要包安装了(或者用pip install -e .开发模式)就能正确获取版本。
内容的提问来源于stack exchange,提问作者CrizR




