当前位置: 首页 > 面试题库 >

与setup.py和软件包共享软件包版本的正确方法是什么?

蓟俊杰
2023-03-14
问题内容

使用distutilssetuptools等,在setup.py以下位置指定软件包版本:

# file: setup.py
...
setup(
name='foobar',
version='1.0.0',
# other attributes
)

我希望能够从包中访问相同的版本号:

>>> import foobar
>>> foobar.__version__
'1.0.0'

我可以将其添加__version__ = '1.0.0'到包的__init__.py中,但是我还想在包中包括其他导入,以创建包的简化接口:

# file: __init__.py

from foobar import foo
from foobar.bar import Bar

__version__ = '1.0.0'

# file: setup.py

from foobar import __version__
...
setup(
name='foobar',
version=__version__,
# other attributes
)

但是,foobar如果这些其他导入导入尚未安装的其他软件包,则可能导致安装失败。与setup.py和软件包共享软件包版本的正确方法是什么?


问题答案:

setup.py仅设置版本,然后使用读取自己的版本pkg_resources,从而有效地查询setuptools元数据:

文件: setup.py

setup(
    name='foobar',
    version='1.0.0',
    # other attributes
)

文件__init__.py

from pkg_resources import get_distribution

__version__ = get_distribution('foobar').version

为了在所有情况下都能正常工作,您可能最终无需安装就运行它,请测试DistributionNotFound并确定分发位置:

from pkg_resources import get_distribution, DistributionNotFound
import os.path

try:
    _dist = get_distribution('foobar')
    # Normalize case for Windows systems
    dist_loc = os.path.normcase(_dist.location)
    here = os.path.normcase(__file__)
    if not here.startswith(os.path.join(dist_loc, 'foobar')):
        # not installed, but there is another version that *is*
        raise DistributionNotFound
except DistributionNotFound:
    __version__ = 'Please install this project with setup.py'
else:
    __version__ = _dist.version


 类似资料:
  • 软件包的版本号是个奇怪的东西。它们看起来像十进制的数字,但它们不是。 例如,一个版本号通常的形式为 2.6.4。如果你需要比较两个版本号, 不能做简单的字符串比较,因为 2.6.4 会比 2.6.12 大;也不能进行数字比较, 因为它们不是有效地数字。 Puppet 的 versioncmp 函数会帮我们解决这个问题。 若你给它传递两个版本号,它会比较它们,并返回一个值,指出谁是更大的: ve

  • 问题内容: 如何从软件包中定义版本(出于或其他目的)? 问题答案: 询问已安装发行版的版本字符串 要在运行时从程序包内部检索版本(您的问题似乎在问什么),可以使用: 存储版本字符串以在安装期间使用 如果您想沿另一方向走动(这似乎是其他答案作者似乎认为您正在询问的问题),请将版本字符串放在单独的文件中,然后在中读取该文件的内容。 您可以用一行在软件包中创建一个version.py ,然后使用来从se

  • 问题内容: 在我的GOPATH中,我有类似以下内容: 在我,在和我有。 当我尝试出现以下错误时: 这是否意味着任何属于的文件都应该放在其自己的文件夹中?如果是这样,原因是什么? 问题答案: 是的,每个程序包必须在其自己的目录中定义。 源结构在如何编写Go代码中定义。 包是可以在多个程序中使用,可以发布,导入,从URL获取等的组件。因此,使其具有自己的目录和程序可以具有的目录一样多是有意义的。

  • 本文向大家介绍Perl中的软件包是什么?,包括了Perl中的软件包是什么?的使用技巧和注意事项,需要的朋友参考一下 Perl中的package语句将当前命名上下文切换到指定的命名空间(符号表)。因此- 包是驻留在其自己的命名空间中的代码的集合。 命名空间是唯一变量名称的命名集合(也称为符号表)。 命名空间可防止程序包之间的变量名冲突。 包使模块的构造成为可能,这些模块在使用时不会破坏模块自身命名空

  • 问题内容: 我正在使用Eclipse,并且有一段时间没有使用Java了。但是,我可以在命令行上编译我的代码,并生成必要的文件。在Eclipse中,它抱怨。这是什么意思,我该如何解决? 样例代码: 我的项目的名称是。 问题答案: Eclipse希望声明的包与目录层次结构匹配-因此,它希望Java文件位于源根目录下的“ Devices”目录中。目前,该文件似乎直接位于您的源根目录中。因此,创建适当的目

  • Tazpkg - 软件包管理器 Slitaz提供一个小型软件包管理器,它能轻易在系统里安装许多软件。Tazpkg是一个由SHell脚本写的轻量级的软件包管理器,能安 装.tazpkg文件。它能在Busybox、ash shell和bash中正常运行。Tazpkg可以让你列出软件包列表、安装软件包、删除软件包、下载软件包、解压软件包、打包软件包、查找软件包或者取 得有关可用软件包或所有已安装软件包的