Учитывая имя пакета 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?