Как найти «имя импорта» любого пакета в Python? - PullRequest
13 голосов
/ 25 августа 2011

Интересно, есть ли надежный и надежный способ получить "имя импорта" / пространство имен пакета Python. Например;

пакет ; Джанго-Хейстек
Название импорта ; стог

или

пакет ; Ipython
Название импорта ; IPython

Насколько я знаю, PyPi не хранит ту информацию, которую я проверял с помощью PyPiXmlRpc.

Я также пытался автоматизировать загрузку пакета, распаковать его и выкопать .egg-info, но в некоторых пакетах этой папки вообще нет.

Любая помощь будет оценена по достоинству и будет использована для хорошего гаджета:)

Ответы [ 3 ]

6 голосов
/ 05 мая 2017

Колеса

Я знаю, что это старый вопрос, но с тех пор были изобретены пакеты wheel !Поскольку wheel - это просто zip-файл, который извлекается в каталог lib / site-packages, проверка содержимого архива wheel может дать вам импорт верхнего уровня.

>>> import zipfile
>>> zf = zipfile.ZipFile('setuptools-35.0.2-py2.py3-none-any.whl')
>>> top_level = set([x.split('/')[0] for x in z.namelist()])
>>> # filter out the .dist-info directory
>>> top_level = [x for x in top_level if not x.endswith('.dist-info')]
>>> top_level 
['setuptools', 'pkg_resources', 'easy_install.py']

Таким образом, setuptools фактически дает вам три импорта верхнего уровня!

pip download

pip теперь имеет команду загрузки, так что вы можете просто pip download setuptools (или любой другой пакет, который вам нравится) и затем изучитьэто.

Обратный взгляд вверх

К сожалению, я еще не нашел легкий способ пойти другим.То есть, учитывая имя импорта, каково имя пакета.Это может быть проблемой, если вы смотрите какой-то пример кода или, может быть, если вы используете Anaconda, которая поставляется с кучей предустановленных пакетов, и вы хотите знать фактическое имя пакета.

3 голосов
/ 25 августа 2011

В принципе, все, что вам нужно для получения этой информации, находится в setup.py, который должен быть в каждом таком пакете. Эта информация примерно будет объединением пакетов, py_modules, ext_package и ext_modules объекта Distribution. На самом деле, вот небольшой скрипт, который макетирует distutils.core.setup только для получения этой информации.

import distutils.core
distutils.core._setup_stop_after = "config"
_real_setup = distutils.core.setup
def _fake_setup(*args, **kwargs):
    global dist
    dist = _real_setup(*args, **kwargs)

distutils.core.setup = _fake_setup

import sys
setup_file = sys.argv[1]
sys.argv[:] = sys.argv[1:]
import os.path
os.chdir(os.path.dirname(setup_file))

execfile(os.path.basename(setup_file))

cat = lambda *seq: sum((i for i in seq if i is not None), [])
pkgs = set(package.split('.')[0] for package
           in cat(dist.packages,
                  dist.py_modules,
                  [m.name for m in cat(dist.ext_modules)],
                  [m.name for m in cat(dist.ext_package)]))

print "\n".join(pkgs)

Для многих пакетов это будет работать как шарм, но для контрпримера см. numpy, Он ломается, потому что numpy предоставляет свои собственные distutils , и я не вижу очевидного пути обхода.

2 голосов
/ 18 сентября 2011

Обратите внимание, что то, что вы называете здесь пакетом, является не пакетом, а дистрибутивом .Дистрибутив может содержать ноль или модули модулей или пакетов.Это означает, что не существует однозначного сопоставления дистрибутивов с пакетами.

Я не уверен, что есть способ определить, какие модули и пакеты будут установлены дистрибутивом, кроме как его фактической установки иВнесение изменений в файловую систему для вновь добавленных пакетов, модулей и файлов pth.

...