Когда имя пакета 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:

Потому что эти два понятия на самом деле не связаны.
Один представляет собой концепцию имен пакетов / модулей на языке 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

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