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

时间:2013-12-19 13:32:45

标签: python distutils

如果我使用distutils.core构建了一个python包,例如通过

setup(
    ext_package="foo",
    author="me",
    version="1.0",
    description="foo package",
    packages=["foo",],
)

所有元数据在哪里(它的目的是什么?)以及如何从python中访问它。具体来说,在执行类似

之类的操作后,如何从python控制台访问作者信息
>>> import foo

6 个答案:

答案 0 :(得分: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.

pkg_resources

from pkg_resources import get_distribution

pkg = get_distribution('package_name')  # also contains a metadata

答案 1 :(得分:4)

元数据存储在<package>-<version>-<py version>.egg-info文件中。

创建模块时,您应该使用以下行:

Writing /usr/lib/python2.7/site-packages/foobar-1.0-py2.7.egg-info

此文件包含元数据:

Metadata-Version: 1.0
Name: Foobar
Version: 1.0
Summary: foobar
Home-page: http://foobar.com/
Author: foobar
Author-email: foobar@foobar.net
License: UNKNOWN
Description: UNKNOWN
Platform: UNKNOWN

如果您想要访问它,最好的方法是使用pippkg_resources(如Alexander Zhukov所述) 例如:

>>> import pkg_resources
>>> d = pkg_resources.get_distribution('Foobar')
>>> d.version
'1.0'
>>> d.location
'/usr/lib/python2.7/site-packages'

答案 2 :(得分:1)

仅关于version元数据,我发现使用可用的各种工具非常不可靠,因为它们中的大多数不能涵盖所有情况。例如

  • 内置模块
  • 未安装的模块,只是添加到python路径(例如,通过您的IDE)
  • 可用同一模块的两个版本(在python路径中取代已安装的一个)

由于我们需要一种可靠的方法来获取 any 软件包,模块或子模块的版本,因此我最终写了getversion。使用起来非常简单:

from getversion import get_module_version
import foo
version, details = get_module_version(foo)

有关详细信息,请参见documentation

答案 3 :(得分:1)

Python3.8即将来临,您可能想使用新的importlib.metadata模块来解析所有已安装软件包的元数据。

获取作者信息如下:

>>> from importlib import metadata
>>> metadata.metadata('foo')['Author']
'me'

与以前相比,这要直接得多。

答案 4 :(得分:0)

此数据的一个用途是,如果您要在那里发布包,它将显示在Pypi(http://pypi.python.org/)上。构建它的一种方法是:

位于foo模块的顶层:

__author__= "me"
__version__= "1.0"
__description__= "foo package"
setup.py中的

import foo
setup(

    author = foo.__author__,
    version = foo.__version__,
    description = foo.__description__,
    packages = ["foo",],

)

这样您只需要在一个地方更新元数据,并且在数据包主模块中定义数据时,可以从那里访问它。

答案 5 :(得分:0)

给出setup.py如下:

from distutils.core import setup

setup(
    name         = 'TestApp',
    version      = '0.0.1',
    author       = 'saaj',
    py_modules   = ['app'],
    test_suite   = 'test'
)

对于某些脚本和自动化而不安装软件包,pipeasy_install甚至setuptools都没有提供命令行选项或公共API来读取所有元数据(例如test_suite),这里有一种小小的方式:

python3 -c "import sys, types; m = types.ModuleType('distutils.core'); \
    m.setup = lambda **kwargs: print(kwargs); \
    sys.modules['distutils.core'] = m; import setup" 

这将打印传递给dict的{​​{1}}个关键字参数。

setup()

您可以将{'author': 'saaj', 'version': '0.0.1', 'name': 'TestApp', 'test_suite': 'test', 'py_modules': ['app']} 中的print替换为您需要的输出。如果lambdasetup.py导入setup(),这实际上是推荐方式,只需替换&#34; distutils.core&#34;使用&#34; setuptools&#34;在摘录中。

格式化代码段如下:

setuptools