如何从python控制台中访问python包元数据?

das*_*obu 12 python distutils

如果我已经构建了一个python包distutils.core,例如via

setup(
    ext_package="foo",
    author="me",
    version="1.0",
    description="foo package",
    packages=["foo",],
)
Run Code Online (Sandbox Code Playgroud)

所有元数据在哪里(它的目的是什么?)以及如何从python中访问它.具体来说,如何在执行类似操作后从python控制台访问作者信息

>>> import foo
Run Code Online (Sandbox Code Playgroud)

Arn*_*rne 9

随着 python3.8 的发布,您可能希望使用新的[1]模块来解析任何已安装包的元数据。importlib.metadata

获取作者信息如下所示:

>>> from importlib import metadata
>>> metadata.metadata('foo')['Author']  # let's say you called your package 'foo'
'Arne'
Run Code Online (Sandbox Code Playgroud)

并获取安装版本:

>>> from importlib import metadata
>>> metadata.version('foo')
'0.1.0'
Run Code Online (Sandbox Code Playgroud)

这比您之前必须做的要直接得多。


[1]也可作为 Python2.7 和 3.5+ 的反向移植作为importlib-metadata,感谢@ChrisHunt 指出这一点。

  • 这也可以在 [importlib-metadata](https://pypi.org/project/importlib-metadata/) 中作为 Python 2.7 和 3.5+ 的向后移植。 (4认同)

Ale*_*kov 5

访问元数据的一种方法是使用:

import pip

package = [pckg for pckg in pip.get_installed_distributions() 
            if pckg.project_name == 'package_name'][0]
#  package var will contain some metadata: version, project_name and others.
Run Code Online (Sandbox Code Playgroud)

要么 pkg_resources

from pkg_resources import get_distribution

pkg = get_distribution('package_name')  # also contains a metadata
Run Code Online (Sandbox Code Playgroud)

  • 使用`pip`会在导入时增加一个巨大的延迟,并为您自己的代码增加了大量的内存占用.它内部只是使用`pkg_resources`并且给你一个相同的结果; 基本上,这里的"pip"是无关的,是一种误导性的"解决方案".答案实际上并没有获得所需的信息; 从一个`Distribution`对象来看,如何在其他领域中获取版本,作者和描述是非常不明显的.对于初学者,`pkg._get_metadata(pkg.PKG_INFO)`可以将元数据文件中的各行作为列表获取. (6认同)