向 Python 模块添加版本属性

2024-04-24

我正在构建一个 Python 模块,其结构如下:

mypackage/
    mypackage/
        __init__.py
        etc.py
    setup.py
    setup.cfg
    pyproject.toml

为了构建它,我正在运行$ python -m build。我注意到版本号不可用(例如mypackage.__version__安装后未定义),目前我只是手动设置它,例如:

setup.py

setup(..., version='0.0.1' )

pyproject.toml

[project]
version = '0.0.1'

我是 Python 包开发的新手,有一些关于此的帖子,但似乎没有标准的方法。

该软件包非常小,理想情况下我只想更新一件事,例如__version__ = '0.0.1' inside __init__.py,然后自动解析它setup.py and pyproject.toml.


你真的需要/想要一个__version__属性吗?

保持一个__version__模块命名空间中可用的属性是一种流行的约定,但它可能这些天不再流行了 https://peps.python.org/pep-0396/#pep-rejection因为标准库importlib.metadata https://docs.python.org/3/library/importlib.metadata.html#distribution-versions不再是临时的。版本字符串的一个明显位置是在包元数据中,在模块属性中重复相同的信息可能被认为是不必要和多余的。

当版本字符串存在于两个不同的位置时,它还为用户带来了一些难题 - 我们应该首先在包元数据中还是在模块顶级命名空间中查找它?如果在这些地方找到的版本信息是,我们应该相信哪一个?不同的?

因此,仅将其存储在一个位置有一些好处,并且该位置必须是包的元数据。这是因为Version字段是一个required领域中的核心元数据规范 https://packaging.python.org/en/latest/specifications/core-metadata/,但是选择提供的软件包__version__属性只是遵循约定。

获取/设置包元数据中的版本

如果您使用的是现代构建系统,那么您可以直接在中指定版本字符串pyproject.toml如中所述PEP 621 - 在 pyproject.toml 中存储项目元数据 https://peps.python.org/pep-0621/#version。问题中已经显示的方式是正确的:

[project]
name = "mypkg"
version = "0.0.1"

用户mypkg可以像这样检索版本:

from importlib.metadata import version
version("mypkg")

请注意,与访问__version__属性,此版本仅从包元数据中检索,甚至不需要导入实际的包。这在某些情况下很有用,例如具有导入副作用(例如 numpy)的包,或者即使具有不满足的依赖项/复杂的环境设置要求也能够检索包版本的包。

如果您想访问包本身的版本号怎么办?

有时这很有用,例如添加--version命令行界面的选项。但这并不意味着您需要__version__ 属性闲逛时,您可以以相同的方式从您自己的包元数据中检索版本:

parser = argparse.ArgumentParser(...)
...
parser.add_argument(
    "--version",
    action="version",
    version=importlib.metadata.version("mypkg"),
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向 Python 模块添加版本属性 的相关文章

随机推荐

  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • i18next 翻译问题

    我仍然尝试使用 i18next 来翻译我的 jQuery 应用程序 解决了一些一般问题后 此处解决 如何使用i18next 翻译问题 https stackoverflow com questions 13005791 how to use
  • 在后台从 url 加载一个大 plist

    我从 url 加载一个大的 plist 文件 我必须等待几秒钟才能使用该应用程序 有什么解决办法吗 如何在后台加载它 是GCD我需要的 如何实施 My code NSString urlStr NSString alloc initWith
  • 带猫头鹰旋转木马的 Fancybox (lazyLoad)

    我正在使用带有lazyLoad选项的Fancybox v3 5 4和Owl carousel v2 3 4 当我们点击照片时 Fancybox 就会弹出照片 然后 如果我们点击几次 下一步 以获取 Fancybox 上的下一张照片 然后关闭
  • Java:URLConnection合理的超时时间

    默认情况下 URLConnection 的超时时间为 0 无限制 XXXXX 的合理值是多少 URL url URLConnection uCon url openConnection uCon setConnectTimeout XXXX
  • 在 O(n) 时间和 O(1) 空间中生成数组的随机排列

    我们必须生成数组 1 2 3 n in O 1 space 我能够做到O n space I did O n 空间解决方案 首先存储数组 然后将其随机化 但是如何在不存储数组的情况下做到这一点O 1 space 我只是生成随机数 而不是存储
  • 随着新数据的出现,如何增量训练 FANN?

    我使用 FANN 库构建并训练了一个神经网络 这是初步培训 大部分数据将在线收集 当在线数据可用时我想要improve使用这些新数据的网络 不是重新训练 而是使之前的训练更加准确 如何用FANN来做这种增量训练呢 从更改为的文件进行训练 s
  • Flask - POST 错误 405 方法不允许

    我刚刚开始学习 Flask 我正在尝试创建一个表单 该表单将允许POST method 这是我的方法 app route template methods GET POST def template if request method PO
  • 这是一个可以将括号中的文本与嵌套括号匹配的正则表达式[重复]

    这个问题在这里已经有答案了 我需要一些帮助来编写一个正则表达式 该正则表达式将括号中的字符串与嵌套括号匹配并以模式开头 注意 父 括号中的文本可以没有嵌套括号 例子 Some text pattern SOME TEXT THAT I WA
  • 如何在python中更改ttk.progressBar颜色

    有谁知道如何更改 ttk progressBar 的颜色 它现在显示绿色 我希望它是蓝色的 import ttk self progressBar ttk Progressbar frame3 length 560 maximum 100
  • Bigquery - json_array 来自字段的额外多个元素

    我的表有一个 JSON 字段 如下所示 每个条目中可以有任意数量的评论 entry 1234 comment 6789 seconds 1614864327 nanoseconds 606000000 message hello world
  • Pandas 数据框获取每组的第一行

    我有一只熊猫DataFrame像下面这样 df pd DataFrame id 1 1 1 2 2 3 3 3 3 4 4 5 6 6 6 7 7 value first second second first second first t
  • 在 OS Hardened 机器中使用 c# 禁用任务管理器

    我使用下面的代码来禁用完美运行的信息亭应用程序的任务管理器 public void DisableTaskManager RegistryKey regkey string keyValueInt 1 string subKey Softw
  • 将数组 php 转换为 java

    我正在开发一个包含 java 文件和 php 文件的应用程序 java 文件调用 php 文件 这些文件在 ddbb 中执行查询并将结果作为数组 php 返回 但将其打印在屏幕上 我在java中把它当作一个字符串 我必须将它转换为数组或集合
  • 将字符串 ascii 转换为字符串 Hex

    假设我有这个字符串 string str 1234 我需要一个函数将该字符串转换为该字符串 0x31 0x32 0x33 0x34 我在网上搜索了很多类似的东西 但没有找到这个问题的答案 string str 1234 char charV
  • 共享图像的正确方法(使用意图)

    我在应用程序中创建图像 并希望共享这些社交网络 facebook 邮件应用程序 gmail 以及其他可以 接收 图像的应用程序 问题的根源 我认为 是我不想使用外部存储作为图像的基础 我想使用我的数据文件夹或缓存文件夹 因为它们都不需要任何
  • 如何使 Selenium WebDriver 动态选择客户端证书而不用视觉检测弹出窗口

    我正在尝试使用 Java 和 Selenium 来测试需要客户端证书的网站 当我浏览我的网站时 我会看到一个如下所示的弹出窗口 以选择正确的证书 我的要求如下 按名称选择证书 在不同版本的 Windows IE Edge 上 理想情况下 永
  • NamedEntityGraph - JPA / Hibernate 抛出 org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包

    我们有一个项目 需要延迟加载实体的集合 但在某些情况下 我们需要急切地加载它们 我们添加了一个 NamedEntityGraph对我们的实体进行注释 在我们的存储库方法中 我们添加了一个 javax persistence loadgrap
  • 将 true 或 false 转换为显式布尔值,即 True 或 False

    我有一个变量 我们就这样称呼它吧toto This toto可以设置为undefined null 字符串或对象 我想检查一下是否toto设置为数据 即设置为字符串或对象 两者都不是undefined nor null 并在另一个变量中设置
  • 向 Python 模块添加版本属性

    我正在构建一个 Python 模块 其结构如下 mypackage mypackage init py etc py setup py setup cfg pyproject toml 为了构建它 我正在运行 python m build