Когда имя пакета Python отличается от имени импорта
Проблема заключается в пакетах Python, имена которых отличаются от использования при импорте, например:
$ pip list | grep -i "yaml\|qt"
PyYAML 3.13
QtPy 1.5.2
- pyyaml (pip instal pyyaml), но импорт yaml
- qtpy (pip install qtpy), да, импорт - это qtpy, но пакет - это QtPy
Некоторые инструменты не могут справиться с этим, например, sphinx:
$ make html
WARNING: autodoc: failed to import module 'wireshark' from module 'logcollector.plugins'; the following exception was raised:
No module named 'qtpy'
Не помню сейчас, но то же самое относится и к инструментам, которые сканируют файл require.txt и выводят предупреждения о том, что пакет python yaml не установлен (но он есть и его имя - pyyaml).
2 ответа
Есть несколько причин, по которым авторы предпочитают использовать разные имена в разных средах:
- Выпадающая замена: иногда бывает полезно, если вы можете установить форк и оставить остальной код неизменным. Думаю, самый известный пример - это пьямл / ямл. Я сделал это, когда создал
propy3
который можно использовать как замену дляpropy
. Я бы сказал, что то же самое произошло и сpillow
. - Удобство:
beautifulsoup4
можно импортировать какbs4
(+ пакетная парковка наbs4
) - Утерянные учетные данные: я не знаю примера, где имя импорта также было изменено, но я думаю, что для
flask-restx
имя пакета и имя импорта были изменены.
Слово предостережения
Как указал Зияд Эдер в ходе обсуждения по теме, типосквоттинг - это проблема PyPI (источник). Если вы добавляете пакеты с разными именами, это становится более вероятным.
Другие примеры
Имя в документации vs имя пакета "import" vs имя пакета pypi vs пакеты anaconda vs Debian:
- scikit-learn vs sklearn vs scikit-learn vs scikit-learn vs python-sklearn и python3-sklearn
- OpenCV-Pyton против cv2 против opencv-python против py-opencv против python-opencv
- PyTables vs таблицы vs таблицы vs pytables vs python-таблицы
Потому что эти два понятия на самом деле не связаны.
Один представляет собой концепцию имен пакетов / модулей на языке Python, другой - концепцию менеджера пакетов.
Посмотрите на простую команду упаковки с zip:
zip -r MyCoolTool.zip tool.py
Инструмент назван tool
что, вероятно, не является уникальным, и если вы не знаете, что его MyCoolTool, вы не знаете, какой tool
это. Когда я загружаю это куда-то, я называю это MyCoolTool
Таким образом, теперь у вас есть более уникальное имя, которое может быть немного более наглядным.
Другое дело, что пакет pip может включать в себя больше модулей, чем один. PyYAML
может, например, включить второй модуль Python yaml2xml
в дополнение к yaml
,
Наконец, может быть несколько реализаций. PyYAML
звучит как чистая реализация Python. Теперь предположим, что вам нужен действительно быстрый парсер, тогда вы можете запрограммировать CYAML
с C-backend, но тот же интерфейс на имя yaml
,
В случае с sphinx вы можете смоделировать сторонние пакеты с помощью: autodoc_mock_imports