如何从pkg_resources中的Distribution对象获取作者姓名,项目描述等?

时间:2012-05-12 20:29:53

标签: python setuptools distribute

pkg_resources api让你得到代表目录内蛋分布的Distribution对象。我可以通过dist.project_namedist.version轻松获取分发的项目名称和版本,但是我失去了如何获取通常在安装脚本中指定的其他元数据(如作者,描述)等等。)

2 个答案:

答案 0 :(得分:2)

我正在寻找如何做同样的事情。这就是我提出的。它可能不是最好的解决方案,但似乎有效。

# get the raw PKG-INFO data
from pkg_resources import get_distribution
pkgInfo = get_distribution('myapp').get_metadata('PKG-INFO')

# parse it using email.Parser
from email import message_from_string
msg = message_from_string(pkgInfo)
print(msg.items())

# optional: convert it to a MultiDict
from webob.multidict import MultiDict
metadata = MultiDict(msg)
print(metadata.get('Author'))
print(metadata.getall('Classifier'))

答案 1 :(得分:0)

这里的问题相同。我通过在package.py下创建了一个文件mymodule来解决它,并将所有变量硬编码到setup.py中。然后在setup.py

pkg_info = get_package_info('mymodule')
setup(**pkg_info)

但是在setup.py中,我无法直接import mymodule.package as pkg_info,因为这会导致setup.py要求它定义的模块。因此,get_package_info(module_name)中需要自定义导入方法setup.py

def get_package_info(module_name):
    '''
    Read info about package version, author etc
    from <module_name>/package.py

    Return:
        dict {'version': '1.2.3', 'author': 'John Doe', ...}
    '''
    here = os.path.dirname(os.path.abspath(__file__))
    code_globals = {}
    code_locals = {}
    with open(os.path.join(here, module_name, 'package.py')) as f:
        code = compile(f.read(), "package.py", 'exec')
        exec(code, code_globals, code_locals)
    return code_locals

mymodule/package.py

# -*- coding: utf-8 -*-
name = 'mymodule'
version = '1.2.3'
description = 'My module for demonstration'
url = 'https://github.com/myorg/mymodule'
author = 'John Doe'
author_email = 'john.doe@example.com'

...

packages = ['mymodule']
install_requires = ['myotherpackage', 'somepackage']

...

使用这种方法,我可以在任何可以访问模块的地方轻松访问包信息,例如:from mymodule.package import version, author。此外,信息只需存储在一个地方。