Учитывая имя пакета Python, как называется модуль для импорта?

Знает ли кто-нибудь логику, лежащую в основе имен модулей Python, против имени фактического пакета, используемого в easy_install?

Несколько (среди прочих) примеров, которые кажутся мне немного нелогичными:

  • Мы делаем easy_install mysql-python, но импорт на самом деле import MySQLdb
  • Мы делаем easy_install python-memcached, но импорт на самом деле import memcache (без завершающего г)

Я не нашел последовательного способа найти эквивалентность. Для некоторых модулей мне потребовалось много времени, чтобы найти его. Что я делаю неправильно?

2 ответа

Решение

К сожалению, нет никакого метода к безумию. Имя в индексе пакета не зависит от имени модуля, который вы import, Катастрофически некоторые пакеты имеют общие имена модулей. Если вы установите оба, ваше приложение сломается с четными коэффициентами. (У Ruby тоже есть эта проблема)


Упаковка в Python, как правило, ужасна. Основная причина в том, что язык поставляется без менеджера пакетов. Ruby и Nodejs поставляются с полнофункциональными менеджерами пакетов Gem и Npm, и создали сообщества для обмена, сосредоточенные вокруг GitHub. Npm делает публикацию пакетов так же просто, как и их установку. Nodejs прибыл в 2009 году и уже имеет 14 тыс. Пакетов. Почтенный индекс пакетов Python перечисляет 24k. Ruby Gems перечисляет 44 тыс. Пакетов.

К счастью, есть один достойный менеджер пакетов для Python, который называется Pip. Pip вдохновлен Ruby's Gem, но в нем отсутствуют некоторые жизненно важные функции (например, перечисление пакетов и массовое обновление). Как ни странно, сам Пип сложен в установке. Установка на популярной 64-битной Windows требует сборки и установки двух пакетов из исходного кода. Это большая просьба для любого новичка в программировании.

Разработчики Python не знают всего этого разочарования, потому что они опытные программисты, которым удобно собирать исходники, и они используют дистрибутивы Linux с упакованными модулями Python.

Пока Python не поставляется с менеджером пакетов, тысячи разработчиков будут без необходимости тратить время на то, чтобы заново изобретать колесо.


Python 3 решает множество проблем с упаковкой. Для Python 3 нет пакетов.

В отличие от принятого ответа, это действительно возможно, хотя на самом деле довольно громоздко.

Названия модулей можно найти top_level.txt файл в каталоге метаданных пакета установки.

Чтобы получить доступ к нему с помощью Python (заменить python-memcached с названием вашего пакета):

>>> import pkg_resources as pkg # included in setuptools package
>>> metadata_dir = pkg.get_distribution('python-memcached').egg_info
>>> open('%s/%s' % (metadata_dir, 'top_level.txt')).read().strpline()
'memcache'

Или с эквивалентным bash "один лайнер":

cat $(python -c "import pkg_resources; \
print(pkg_resources.get_distribution('python-memcached').egg_info)")/top_level.txt

Имейте в виду, что некоторые пакеты устанавливают несколько модулей, поэтому метод, который я представляю, может возвращать несколько имен модулей.

pip search mysql

И это тоже хорошее чтение: зачем использовать pip вместо easy_install?

Другие вопросы по тегам