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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:35:26