提取项目的__version__变量
项目描述
注意: 自从setuptools 46.4.0版本发布以来,setuptools已经原生支持在setup.cfg中使用attr:指令,根据项目源代码的静态分析来设置项目版本。这使得read_version的大部分用例变得过时,因此它将不会获得进一步的开发。
在为新的项目创建setup.py时,您是否发现自己总是在编写相同的代码块来解析项目源代码中的__version__?类似这样的?
with open(join(dirname(__file__), 'package_name', '__init__.py')) as fp: for line in fp: m = re.search(r'^\s*__version__\s*=\s*([\'"])([^\'"]+)\1\s*$', line) if m: version = m.group(2) break else: raise RuntimeError('Unable to find own __version__ string') setup( version = version, ... )
有人需要把这些内容放入一个可重用的包中,对吧?是的,有人已经这么做了,这就是那个包。它导出单个函数,执行上述操作,非常适合导入到你的 setup.py 文件中,并且(从 v0.2.0 版本开始新增!)这个包还允许你通过 pyproject.toml 将 Python 变量映射到受支持的元数据字段。
安装
read_version 需要 Python 3.6 或更高版本。只需使用 Python 3 的 pip 来安装 read_version 及其依赖项。
python3 -m pip install read_version
read_version 还有一个 toml 扩展,它提供了从 pyproject.toml 读取配置的支持。使用以下命令安装它:
python3 -m pip install "read_version[toml]"
使用方法
函数式方法
在您的开发环境中安装 read_version。
在您的项目中添加一个 pyproject.toml 文件,声明 read_version 为构建依赖项。(这是为了让其他人能够从源代码构建您的包;有关更多信息,请参阅 PEP 518。)文件的內容应类似于以下内容:
[build-system] requires = [ "read_version ~= 0.3.0", "setuptools", "wheel" ] build-backend = "setuptools.build_meta"
在您的 setup.py 中,删除您那些模板化的 __version__ 查找代码,并用以下内容替换它:
from read_version import read_version setup( version = read_version('packagename', '__init__.py'), ... )
构建您的项目,并确保版本已设置为正确的值。
完成!
声明式方法
从版本 0.2.0 开始新增!
使用 toml 扩展在您的开发环境中安装 read_version。
pip install 'read_version[toml]'
您还需要 setuptools 的 42.0.0 或更高版本。
pip install -U 'setuptools>=42'
将 pyproject.toml 文件添加到您的项目中,声明 read_version[toml] 为构建依赖项,并要求 setuptools 的版本为 42.0.0 或更高。文件的相应部分应类似于以下内容:
[build-system] requires = [ "read_version[toml] ~= 0.3.0", "setuptools >= 42.0.0", "wheel" ] build-backend = "setuptools.build_meta"
在您的 setup.py 中删除您那些模板化的 __version__ 查找代码。相反,在您的 pyproject.toml 文件中添加一个 tool.read_version 表,并为每个您希望从 Python 源文件中的变量读取的元数据字段添加一个条目到这个表中,格式为 FIELD = "dotted.file.path:varname",其中:
FIELD 被替换为字段的英文小写名称。支持的字段有:
author
author_email
description(注意,这是简短描述或摘要,而不是长描述!)
keywords(建议使用字符串列表作为值,否则 setuptools 可能会对其进行损坏)
license
maintainer
maintainer_email
url
version
不支持或未知字段名的条目将被忽略。
dotted.file.path 被替换为包含变量的文件的路径(相对于项目根目录),路径组件用点分隔,最后路径组件的 .py 被省略。
varname 被替换为要读取的变量名称。
示例
[tool.read_version] # Set the project's version to the value of __version__ in foobar.py: version = "foobar:__version__" # Set the project's author to the value of author_name in # foobar/__init__.py author = "foobar.__init__:author_name" # Set the project's license to the value of LICENSE in # src/foobar/about.py: license = "src.foobar.about:LICENSE"
如果这个语法对您不起作用——比如说,因为您的路径组件中包含一个点或冒号,或者文件没有 .py 扩展名——或者您想为找不到变量设置默认值,那么将 tool.read_version.FIELD 设置为一个表格,如下所示:
# Set the project's version to the value of __version__ in # foo.bar/__init__.pyq: [tool.read_version.version] path = ["foo.bar", "__init__.pyq"] variable = "__version__" # Set the project's author_email to the value of EMAIL in foobar.py. # If the variable isn't found, use the value "me@example.com" instead # of erroring [tool.read_version.author_email] path = ["foobar.py"] variable = "EMAIL" default = "me@example.com"
tool.read_version.FIELD 表可能包含以下键
- 路径:
(必需) 读取变量的源文件的路径,相对于项目根目录,作为路径组件的列表
- 变量名:
(必需) 要从中获取值的 Python 变量的名称
- 默认值:
(可选) 如果在源文件中找不到变量,则使用给定值代替;如果找不到变量且未设置 default,则将引发错误
构建您的项目,并确保元数据中所有相关字段都已设置为正确的值。
完成!
API
read_version 导出一个名为 read_version 的单个函数,其签名也是 read_version
read_version(*filepath, variable='__version__', default=NOTHING)
read_version() 接受指向要解析的 Python 源文件的文件路径组件,一个或多个。路径组件将使用 os.path.join() 连接在一起,然后,如果路径不是绝对路径,则将调用 read_version() 的脚本的目录路径添加到路径之前。(不再需要 join(dirname(__file__), ...) 空板!)然后 read_version() 解析给定的 Python 文件,并搜索解析树中任何对名为 __version__ 的变量的赋值,返回最后赋的值。
可以将 variable 关键字参数设置为除了 __version__ 之外的其他变量的名称,以搜索不同变量的赋值。将其设置为 "__doc__" 将导致函数返回模块文档字符串。
如果没有找到变量的赋值,将引发 ValueError。要在此情况下返回默认值,请设置 default 关键字参数。
限制
read_variable 仅查找模块顶层发生的赋值,不在任何块之外。
仅支持字面值赋值;涉及更复杂表达式的搜索变量的赋值将引发错误。
项目详情
下载文件
下载适合您平台文件的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
构建分布
read_version-0.3.2.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3f2d30852bce9174b244f7f29aaebf4e79904c6ed51a19716325015ff306ce3f |
|
MD5 | 0be44e6819eb039c86cf55a413733645 |
|
BLAKE2b-256 | 9c2fe6ed7dd2e34706b7b04f08204f425ea16deb949f4374e5e445fd20a7702f |