【问题标题】:How can I get the author name, project description etc from a Distribution object in pkg_resources?如何从 pkg_resources 中的 Distribution 对象获取作者姓名、项目描述等?
【发布时间】:2012-05-20 23:36:35
【问题描述】:

pkg_resources api 让您获得表示目录内鸡蛋分布的分布对象。我可以使用dist.project_namedist.version 轻松获取项目名称和分发版本,但是我不知道如何获取通常在安装脚本中指定的其他元数据(如作者、描述等)

【问题讨论】:

    标签: python setuptools distribute


    【解决方案1】:

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

    # 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'))
    

    【讨论】:

    • 注意:如今在 Python 中,元数据文件更可能被命名为 METADATA 而不是 PKG-INFO
    【解决方案2】:

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

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

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

    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。此外,信息只需要存储在一个地方。

    【讨论】:

    • 对于long_description,我阅读了 README.rst 文件。为了避免每次导入 mymodule 时读取文件,在setup.py 中我有:pkg_info['long_description'] = read_long_descriptionsetup(**pkg_info) 之前。
    猜你喜欢
    • 2018-01-13
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多