Поиск пакетов, поддерживающих Python 3.x vs. 2.7.x

Существуют ли какие-либо методы для автоматически, какие версии Python поддерживаются пакетами на PIP?

Я ищу что-то, что генерирует таблицу, подобную той, которая получена автоматически из индекса PIP. Также полезно будет использовать таблицу вручную из известных репозиториев GitHub и участников сообщества.

           2.7.x   3.x
foo         ✓       ✗
bar         ✓       ✓
baz         ✗       ✓

Кто-нибудь скомпилировал такую ​​таблицу раньше? Любые мысли о том, как я могу автоматически получить эту информацию?

Ответ 1

Просто используйте это: https://pypi.python.org/pypi/caniusepython3/

Для статистики это список распаковки распаковки (всего 161): https://github.com/openstack/requirements/blob/master/global-requirements.txt

И вот что удерживает их:

  [email protected]:/tmp$ caniusepython3 -r requirements.txt 
  Finding and checking dependencies ...

  You need 67 projects to transition to Python 3.
  Of those 67 projects, 65 have no direct dependencies blocking their transition:

  boto
  cmd2
  coinor.pulp
  croniter
  ddt
  diskimage-builder
  django-bootstrap-form
  django-compressor
  django-openstack-auth
  dnspython
  eventlet
  extras
  gear
  hacking
  thrift (which is blocking happybase)
  jsonrpclib
  mysql-python
  netifaces
  nose-exclude
  nosehtmloutput
  nosexcover
  openstack-doc-tools
  openstack.nose-plugin
  os-apply-config
  os-collect-config
  os-refresh-config
  oslo.config
  oslo.messaging
  oslo.rootwrap
  oslo.sphinx
  oslosphinx
  pam
  ecdsa (which is blocking paramiko)
  paste
  posix-ipc
  proboscis
  pycadf
  pyghmi
  python-ceilometerclient
  python-cinderclient
  python-designateclient
  python-glanceclient
  python-heatclient
  python-ldap
  python-neutronclient
  python-openstackclient
  python-savannaclient
  python-seamicroclient
  python-swiftclient
  python-troveclient
  qpid-python
  rtslib-fb
  sockjs-tornado
  sphinxcontrib-docbookrestapi
  sphinxcontrib-httpdomain
  sphinxcontrib-pecanwsme
  sqlalchemy-migrate
  suds
  swift
  taskflow
  tripleo-image-elements
  warlock
  websockify
  xenapi
  zake

Ответ 2

К сожалению, PyPI API выглядит довольно плохо. Вы можете взаимодействовать с ним через XMLRPC, но возвращаемые значения плохо документированы (py_version может быть пустым или "источником", что бы это ни значило, например). Вероятно, наиболее точной задачей было бы загрузить каждый пакет и использовать эвристику, но, в остальном, система тегов, кажется, лучшая ставка. Он не поддерживается API, но вы можете легко очистить его от веб-страницы:

def package_supports_py3(pkg):
    b = bs4.BeautifulSoup(requests.get('https://pypi.python.org/pypi/' + pkg).text)
    return 'Programming Language :: Python :: 3' in map(lambda li: li.find('a').text, b.find('strong', text = 'Categories').next_sibling.next_sibling.find_all('li'))

>>> package_supports_py3('virtualenv')
True
>>> package_supports_py3('oh-my-vim')
False # but it doesn't have /any/ python version related tags, so who knows...

(требуется BeautifulSoup4 и requests)

Этот метод не даст ложного положительного результата, но у него есть хорошие шансы на отсутствие пакетов, которые фактически обновлены до py3. Если вам нужно, чтобы это было надежным, я бы предложил комбинацию проверки python_version, этого метода и ручного переопределения. Если вы просто закручиваетесь, этот метод должен быть достаточно хорошим, так как большинство более крупных, хорошо работающих проектов, похоже, соблюдают рекомендации по маркировке.