Как мне получить URL дистрибутива Python?

В своих файлах setup.py Python предоставляет некоторую информацию. Эта информация может быть найдена в файле PKG_INFO яйца.

Как я могу получить к ним доступ после установки пакета?

Например, если у меня есть следующий модуль:

setup(name='myproject',
      version='1.2.0.dev0',
      description='Demo of a setup.py file.',
      long_description=README + "\n\n" + CHANGELOG + "\n\n" + CONTRIBUTORS,
      license='Apache License (2.0)',
      classifiers=[
          "Programming Language :: Python",
          "Programming Language :: Python :: 2",
          "Programming Language :: Python :: 2.7",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.4",
          "Programming Language :: Python :: 3.5",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Internet :: WWW/HTTP",
          "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
          "License :: OSI Approved :: Apache Software License"
      ],
      keywords="web sync json storage services",
      url='https://github.com/Kinto/kinto')

Как я могу использовать Python для получения информации, представленной в файле setup.py?

Я думал о чем-то похожем на это:

import pkg_resource
url = pkg_resource.get_distribution(__package__).url

Любая идея?

3 ответа

Решение

Существует, очевидно, частный API, который позволяет вам делать это с pkg_resources:

import pkg_resources
d = pkg_resources.get_distribution(__package__)
metadata = d._get_metadata(d.PKG_INFO)
home_page = [m for m in metadata if m.startswith('Home-page:')]
url = home_page[0].split(':', 1)[1].strip()

Я хотел бы, чтобы мы могли сделать лучше.

Я хотел бы, чтобы мы могли сделать лучше.

На самом деле, мы можем. Нет необходимости использовать приватный метод, мы могли бы просто сделать:

import pkg_resources
import distutils
import io

distribution = pkg_resources.get_distribution(__package__)
metadata_str = distribution.get_metadata(distribution.PKG_INFO)
metadata_obj = distutils.dist.DistributionMetadata()
metadata_obj.read_pkg_file(io.StringIO(metadata_str))
url = metadata_obj.url

Начиная с Python 3.8, вы можете использовать importlib.metadata для извлечения метаданных пакета.

Например, чтобы извлечь метаданные urllib3:

      >>> from importlib import metadata
>>> import urllib3
>>> list(metadata.metadata('urllib3'))
['Metadata-Version', 'Name', 'Version', 'Summary', 'Home-page', 'Author', 'Author-email', 'License', 'Project-URL', 'Project-URL', 'Project-URL', 'Description', 'Keywords', 'Platform', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Requires-Python', 'Provides-Extra', 'Provides-Extra', 'Provides-Extra']
>>> metadata.metadata('urllib3')['Version']
'1.25.8'
>>> metadata.metadata('urllib3')['Project-URL']
'Documentation, https://urllib3.readthedocs.io/'
Другие вопросы по тегам