如何通过Setuptools自动填充版权信息中的年份与公司名称?
实现__YEAR__和__COMPANY__自动填充的几种方案
方案一:借助setuptools_scm自定义模板生成version.py
利用setuptools_scm的模板扩展能力,在自动生成的version.py中加入年份和公司字段,再在__init__.py中导入使用。
步骤1:修改setup.cfg配置
在setup.cfg中新增tool.setuptools_scm配置段,指定自定义模板:
[build-system] requires = setuptools>=60.0.0 setuptools_scm wheel [metadata] name = your-package-name # 替换为你的实际包名 author = ACME INC # 填写公司名称 [tool.setuptools_scm] write_to = src/your_package/version.py # 替换为你的包路径 write_to_template = """# coding: utf-8 # file generated by setuptools_scm # don't change, don't track in version control __version__ = version = '{version}' __version_tuple__ = version_tuple = {version_tuple} __YEAR__ = '{year}' __COMPANY__ = '{company}' """
步骤2:添加setup.py补充动态值(可选)
如果需要自动获取当前年份,创建setup.py文件:
from setuptools import setup from datetime import datetime setup( use_scm_version={ 'year': datetime.now().year, 'company': 'ACME INC' # 也可直接读取setup.cfg中metadata的author字段 } )
步骤3:更新__init__.py导入逻辑
修改__init__.py,从自动生成的version.py中导入所需字段:
from datetime import datetime try: from . import version __version__ = version.version __YEAR__ = version.__YEAR__ __COMPANY__ = version.__COMPANY__ except ImportError: # 导入失败时的降级处理 __version__ = None __YEAR__ = datetime.now().year __COMPANY__ = 'ACME INC' __copyright__ = f'Copyright {__YEAR__} {__COMPANY__}'
方案二:使用setuptools的configure_file模板功能
setuptools 61.0.0及以上版本支持configure_file功能,可直接将__init__.py作为模板,构建时自动替换占位符。
步骤1:将__init__.py改为模板文件
把原__init__.py重命名为__init__.py.in,内容修改为:
try: from . import version __version__ = version.version except ImportError: __version__ = None __copyright__ = f'Copyright {__YEAR__} {__COMPANY__}'
步骤2:配置setup.cfg
在setup.cfg中添加模板编译配置:
[build-system] requires = setuptools>=61.0.0 setuptools_scm wheel [metadata] name = your-package-name author = ACME INC [tool.setuptools] configure_files = src/your_package/__init__.py.in # 替换为你的模板路径 [tool.setuptools.configure_file] __COMPANY__ = "@metadata:author@" # 直接引用metadata中的author字段
如果需要动态年份,配合setup.py实现:
from setuptools import setup from datetime import datetime setup( options={ 'configure_file': { '__YEAR__': datetime.now().year, '__COMPANY__': 'ACME INC' } } )
步骤3:构建项目
执行python -m pip install .或python setup.py sdist bdist_wheel时,setuptools会自动将模板文件编译为正式的__init__.py,完成占位符替换。
方案三:运行时读取包元数据(无需构建修改)
如果不需要在构建阶段固化字段值,可以在__init__.py中直接读取包的元数据,运行时动态生成版权信息:
try: from . import version __version__ = version.version except ImportError: __version__ = None try: # Python 3.8+ 内置importlib.metadata from importlib.metadata import metadata except ImportError: # Python <3.8 需要提前安装importlib-metadata from importlib_metadata import metadata from datetime import datetime # 读取包元数据 pkg_meta = metadata(__name__) __COMPANY__ = pkg_meta.get("Author", "ACME INC") # 可选择用当前年份,或从git提交历史获取项目创建年份(需额外处理) __YEAR__ = datetime.now().year __copyright__ = f'Copyright {__YEAR__} {__COMPANY__}'
这种方式无需修改构建流程,但依赖运行时元数据读取,年份会随运行时间动态变化(若使用当前年份)。
内容的提问来源于stack exchange,提问作者nowox
相关产品推荐
相关产品推荐

