问题描述
我目前正在使用与此类似的代码
# Returns PKG-INFO in "email format",meaning it looks a little like this:
# Name: some_python_module
# Version: 1.2.3
dist = pkg_resources.get_distribution('some_python_module')
pkginfo = dist.get_metadata(dist.PKG_INFO)
d = dict(line.split(': ',1) for line in pkginfo.split('\n') if ': ' in line)
print(d['Name'])
我想知道是否有一种“干净”的方式来为 Distribution 对象执行此键查找?
请注意,我在这里使用自定义属性,因此在我的特定情况下,仅使用 dist.project_name
或 dist.version
是不够的。
解决方法
从 _parsed_pkg_info
的 DistInfoDistribution
窃取:
dist = pkg_resources.get_distribution('some_python_module')
pkginfo = dist.get_metadata(dist.PKG_INFO)
parsed = email.parser.Parser().parsestr(pkginfo)
print(parsed['Name'])
不确定为什么此方法不在 Distribution
中,因为它似乎对 DistInfoDistribution
和 EggInfoDistribution
都有效——顺便说一下,这就是 dist.PKG_INFO
的用途,此变量在这两者之间有所不同('METADATA'
代表 .dist-info
,'PKG-INFO'
代表 .egg-info
)。
小注:parsestr
返回一个 FeedParser
对象,当您对其调用 print
时,该对象输出解析的输入源——不要被这个混淆,它不是 str
。另请注意,the RFC 不允许在键名中使用空格,这会导致无提示解析器错误!