Какой хороший способ проверить, установлен ли пакет в скрипте Python? Я знаю, что это легко из интерпретатора, но мне нужно сделать это в скрипте.
Думаю, я мог бы проверить, есть ли в системе каталог, созданный во время установки, но мне кажется, что есть способ получше. Я пытаюсь убедиться, что пакет Skype4Py установлен, а если нет, то установлю.
Мои идеи по выполнению проверки
- проверьте каталог в типичном пути установки
- попробуйте импортировать пакет, и если возникнет исключение, установите пакет
python
package
skype
python-import
Кевин
источник
источник
Ответы:
Если вы имеете в виду скрипт на Python, просто сделайте что-нибудь вроде этого:
Python 3.3+ использует sys.modules и find_spec :
Python 3:
Python 2:
источник
Обновленный ответ
Лучший способ сделать это:
Результат:
Проверить,
requests
установлено ли:Почему именно так? Иногда возникают конфликты имен приложений. Импорт из пространства имен приложения не дает полного представления о том, что установлено в системе.
Обратите внимание, что предлагаемое решение работает:
pip install http://some.site/package-name.zip
или любого другого типа архива).python setup.py install
.sudo apt install python-requests
.Случаи, когда это может не сработать:
python setup.py develop
.pip install -e /path/to/package/source/
.Старый ответ
Лучший способ сделать это:
Для pip> = 10.x используйте:
Почему именно так? Иногда возникают конфликты имен приложений. Импорт из пространства имен приложения не дает полного представления о том, что установлено в системе.
В результате вы получите список
pkg_resources.Distribution
объектов. См. В качестве примера следующее:Составьте список:
Проверить,
requests
установлено ли:источник
import json
действительно работает). В этом случае работает метод ice.nicer.if "u'requests'" in installed_packages:
из Обновленного ответа, чтобы работать на меня. Выводprint()
производит это на моем[..., u'pytz', u'requests', ...]
if "requests'"
(обратите внимание на одинарную кавычку в конце). вообще не имеет смысла.pip
. Например, вы можете создать и установить пакет из исходников. Этот ответ их не найдет. Ответ от @ ice.nicer по поводуfind_spec()
верного.По состоянию на Python 3.3, вы можете использовать find_spec () метод
источник
importlib.util.find_spec('google-cloud-logging')
ничего не находит, покаimportlib.util.find_spec('google.cloud.logging')
не найдено. Официальное название и название, которое показывает pip, написано тире, а не точками. Может сбивать с толку, поэтому используйте с осторожностью.Если вы хотите получить чек с терминала, вы можете запустить
и если ничего не возвращается, пакет не установлен.
Если, возможно, вы хотите автоматизировать эту проверку, чтобы, например, вы могли установить ее в случае ее отсутствия, в вашем сценарии bash может быть следующее:
источник
if
для непосредственного тестирования успешной команды:if pip3 show package_name 1>/dev/null; then ...
Как продолжение этого ответа :
Для Python 2. *
pip show <package_name>
будет выполнять ту же задачу.Например
pip show numpy
, вернет следующее или подобное:источник
Вы можете использовать модуль pkg_resources из setuptools. Например:
Обратите внимание, что есть разница между модулем python и пакетом python. Пакет может содержать несколько модулей, и имена модулей могут не совпадать с именем пакета.
источник
Откройте тип командной строки
источник
Я хотел бы добавить к этой теме свои мысли / выводы. Я пишу скрипт, который проверяет все требования для индивидуальной программы. Также есть много проверок с модулями python.
Есть небольшая проблема с
решение. В моем случае вызывается один из модулей python
python-nmap
, но вы импортируете его с помощьюimport nmap
несоответствием имен и, как вы видите. Поэтому тест с вышеуказанным решением возвращает ложный результат, и он также импортирует модуль при попадании, но, возможно, нет необходимости использовать много памяти для простого теста / проверки.Я также обнаружил, что
installed_packages
будет только пакет, установленный с помощью pip . В моей системеpip freeze
возвращается через40
модули Python, аinstalled_packages
есть только1
тот, который я установил вручную (python-nmap).Другое решение ниже, которое, как я знаю, может не иметь отношения к вопросу , но я думаю, что рекомендуется хранить функцию тестирования отдельно от той, которая выполняет установку, она может быть полезна для некоторых.
Решение, которое сработало для меня. Он основан на этом ответе Как проверить, существует ли модуль python без его импорта
ПРИМЕЧАНИЕ: это решение также не может найти модуль по имени
python-nmap
, я должен использоватьnmap
вместо этого (легко жить), но в этом случае модуль вообще не будет загружен в память.источник
Если вы хотите, чтобы ваш скрипт установил недостающие пакеты и продолжил работу, вы можете сделать что-то вроде этого (на примере модуля krbV в пакете python-krbV):
источник
Быстрый способ - использовать инструмент командной строки python . Просто введите
import <your module name>
. Если модуль отсутствует, вы увидите сообщение об ошибке.источник
Хммм ... ближе всего к удобному ответу я использовал командную строку, чтобы попробовать импорт. Но я предпочитаю даже этого избегать.
Как насчет замораживания пипса | grep pkgname '? Я попробовал, работает хорошо. Он также показывает, какая у него версия и установлена ли она в режиме контроля версий (установить) или доступна для редактирования (разработка).
источник
class myError (исключение): пройти # или сделать что-нибудь попробовать: импортировать mymodule, кроме ImportError как e: поднять myError («произошла ошибка»)
источник
В типе Терминала
пример
источник
Я хотел бы прокомментировать ответ @ ice.nicer, но не могу, так что ... моим наблюдениям, пакеты с дефисами сохраняются с подчеркиванием, а не только с точками, как указано в комментарии @dwich
Например, да
pip3 install sphinx-rtd-theme
, но:importlib.util.find_spec(sphinx_rtd_theme)
возвращает объектimportlib.util.find_spec(sphinx-rtd-theme)
не возвращает Noneimportlib.util.find_spec(sphinx.rtd.theme)
вызывает ModuleNotFoundErrorБолее того, некоторые имена полностью изменены. Например, вы это делаете,
pip3 install pyyaml
но он сохраняется просто какyaml
Я использую python3.8
источник
источник
Перейти к варианту №2. Если
ImportError
выброшено, то пакет не установлен (или не установленsys.path
).источник