Поиск пакетов, поддерживающих 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
, этого метода и ручного переопределения. Если вы просто закручиваетесь, этот метод должен быть достаточно хорошим, так как большинство более крупных, хорошо работающих проектов, похоже, соблюдают рекомендации по маркировке.