Почему имена некоторых пакетов Python отличаются от имени импорта?

Некоторые пакеты импортируются со строкой, которая отличается от имени пакета в PyPI, например:

$ 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'

Я не помню этого прямо сейчас, но то же самое касается инструментов, которые сканируют файл requirements.txt и выводят предупреждения о том, что пакет yaml не установлен (но он установлен, и его имя - pyyaml).


person emcek    schedule 26.02.2019    source источник


Ответы (3)


Поскольку эти две концепции на самом деле не связаны.
Одна представляет собой концепцию имен пакетов / модулей в языке Python, а другая - концепцию диспетчера пакетов.

Посмотрите на простую команду упаковки с zip:

zip -r MyCoolTool.zip tool.py

Инструмент называется tool, что, вероятно, не является уникальным, и если вы не знаете, что это MyCoolTool, вы не знаете, какой tool это. Когда я загружаю его куда-нибудь, я называю его MyCoolTool, так что теперь у вас более уникальное имя, которое может быть немного более информативным.

Другой момент заключается в том, что пакет pip может включать больше модулей, чем один. PyYAML может, например, включать второй модуль Python yaml2xml в дополнение к yaml.

Наконец, может быть несколько реализаций. PyYAML звучит как чистая реализация на Python. Теперь предположим, что вам нужен действительно быстрый парсер, тогда вы можете запрограммировать CYAML с помощью C-backend, но с тем же интерфейсом с именем yaml.

person allo    schedule 26.02.2019

В случае sphinx вы можете имитировать сторонние пакеты с помощью: autodoc_mock_imports

person emcek    schedule 27.02.2019

Есть несколько причин, по которым авторы предпочитают использовать разные имена в разных средах:

  • Выпадающая замена. Иногда бывает полезно установить форк, сохранив остальную часть кода без изменений. Думаю, самый известный пример - pyyaml ​​ / yaml. Я сделал это, когда создал propy3, который можно использовать как замену для propy. Я бы сказал, что то же самое произошло и с pillow.
  • Удобство: beautifulsoup4 можно импортировать как bs4 (+ парковка пакета для _ 6_)
  • Утерянные учетные данные: я не знаю примера, где имя импорта также было изменено, но я думаю, что для _ 7_ имя пакета и имя импорта были изменены.

Слово предостережения

Как отметил Зияд Эдер в связанное обсуждение, типосквоттинг - это проблема PyPI (исходный код). Если вы добавляете пакеты с разными именами, это становится более вероятным.

Другие примеры

Имя в документации vs имя пакета "import" vs имя пакета pypi vs пакеты anaconda против Debian :

person Martin Thoma    schedule 27.04.2020