Как проверить, установлен ли модуль в Python?

В терминале после запуска Python, как я узнаю, какие модули присутствуют в python? Предположим, мне нужно изучить модули NumPy и SciPy.

Как я смогу установить его, если он не установлен? Как я узнаю, если он уже установлен?
1
задан 24 February 2015 в 19:04

8 ответов

Если мы не хотим импортировать нежелательный модуль (что произойдет в инструкции try), мы можем использовать sys.modules для тестирования модулей, которые были установлены и были импортированы ранее.

В проблеме оболочки python:

>>> import sys

Затем проверьте наличие установленных модулей:

>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False

Обратите внимание, что только те модули, которые были импортированы, перед тем, как дать True на этом test, все остальные модули (даже если они установлены) приводят к False.

. Другая альтернатива try оператора import в консоли python вызывает встроенную функцию help(). Это не даст документации для не установленных модулей, например

>>> help('scipy')
no Python documentation found for 'scipy'

Вывод очень длинных справочных документов установленных модулей может быть прерван Q.

Теперь, чтобы установить отсутствующие модулей рекомендуется использовать и (а не путь Python), потому что нам нужен root-доступ, а также для предотвращения испорчения нашей сильно зависимой от Python системы. Для рассматриваемого модуля это будет, например, be:

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

После установки мы можем добавить их в словарь sys.modules, импортировав их один раз.

17
ответ дан 23 May 2018 в 23:02
  • 1
    Я думаю, что это самый пифонический ответ .... – Grijesh Chauhan 22 February 2015 в 20:48
  • 2
    Первая часть этого неверна: sys.modules содержит только модули, у которых уже был импортирован , поэтому он не является надежным способом проверить, установлен ли модуль. Самым надежным тестом является использование try/except и ловушка ImportError, как уже говорили некоторые другие. – ekhumoro 22 February 2015 в 23:16
  • 3
    @ekhumoro - спасибо, я отредактирую свой ответ, чтобы сделать это яснее. – Takkat 23 February 2015 в 00:05
  • 4
    Это все еще кажется недостаточно ясным. Учитывая, что вопрос заключается в том, чтобы выяснить, установлен ли модуль (не импортирован ), sys.modules совершенно не имеет значения, и я думаю, что любое упоминание об этом вводит в заблуждение. Но, возможно, это только я. – David Z 23 February 2015 в 11:32
  • 5
    sys.modules здесь никакой помощи. – cat 7 July 2016 в 02:35

Другим способом является модуль pkgutil. Работает как с Python 2 & amp; 3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

Вам нужно заменить module на имя вашего модуля, например:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
13
ответ дан 23 May 2018 в 23:02
  • 1
    Я видел, как вы меняли некоторые из моих изменений; print() также отлично работает на Python 2; Он рассматривается как синтаксис group-with-parens и не имеет побочных эффектов. Только когда вы хотите добавить несколько элементов (как в print('a', 'b'), это будет рассматриваться как tuple, в котором вам нужно from __future__ import print_function, но в этом случае это неприменимо, вы можете просто написать код с поддержкой пересылки добавив parens (я тестировал свои изменения в Python 2 и 3). – Carpetsmoker 23 February 2015 в 05:24
  • 2
    @Carpetsmoker: Спасибо за указание. Я откатываюсь от старой версии. – cuonglm 23 February 2015 в 05:28
  • 3
    Это отличный ответ. Я добавил производный ответ, который возвращает код выхода / статуса (для управления потоком сценариев оболочки) и принимает имя модуля в качестве аргумента командной строки. askubuntu.com/a/891384/146273 – Bruno Bronosky 14 December 2017 в 22:09

Вы можете поместить код внутри блока try, except.

$ python3 -c "\
try:
    import cow  
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

There was no such module installed
$ python3 -c "\
try:
    import regex
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

Module was installed
9
ответ дан 23 May 2018 в 23:02

Я знаю, что OP первоначально запрашивал решение после запуска Python, но за пределами python я использую pip. На ubuntu: sudo apt-get install python-pip, если он еще не установлен.

Затем, чтобы узнать, какие модули сторонних модулей доступны, просто запустите:

pip freeze

Или даже

[ f2]

И оба будут показывать вам все установленные модули и их версии.

Если модуль, который вы ищете, не установлен, большую часть времени вы можете легко установить его с помощью pip:

pip install <module-name>

Если вы не знаете, существует ли модуль или его имя PyPI, используйте pip search:

pip search <keyword>
8
ответ дан 23 May 2018 в 23:02

Чтобы получить другой ответ, для завершения:

Вы можете (ab) использовать параметр -m. Из man-страницы Python:

   -m module-name
          Searches sys.path for the named module and runs the  correspond‐
          ing .py file as a script.

Что даст нам:

$ python2 -m numpy
/sbin/python2: No module named numpy.__main__; 'numpy' is a package and cannot be directly executed

$ python2 -m math
/sbin/python2: No code object available for math

Но для несуществующих модулей это даст нам:

$ python2 -m doesnt_exist
/sbin/python2: No module named doesnt_exist
[d4 ] Мы могли бы использовать grep для этого:

$ python2 -m doesnt_exist |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Nope

$ python2 -m math |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Yup

Это немного хак-иш, а не то, для чего предназначался -m; но это метод, который требует наименьшего набора текста, если вы хотите быстрый тест: -)

6
ответ дан 23 May 2018 в 23:02
  • 1
    grep -q делает перенаправление ненулевым. – muru 23 February 2015 в 05:13
  • 2
    @muru Yikes! На протяжении многих лет я набрал много бесполезных перенаправлений на /dev/null: - / – Carpetsmoker 23 February 2015 в 05:25

Я написал пример в Python:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])
2
ответ дан 23 May 2018 в 23:02

Можно также использовать pydoc modules, который можно отфильтровать с помощью grep, чтобы найти конкретный модуль. Вывод отображается в градиентном формате. Единственным недостатком этого подхода является то, что он также будет включать файлы python в текущем рабочем каталоге. Тем не менее, я использую его сам большую часть времени, и это один из высоко цитируемых подходов к этому связанному вопросу: https://stackoverflow.com/q/739993/3701431

1
ответ дан 23 May 2018 в 23:02

Проверка оболочки oneliner (полезная для инициализации)

Я обнаружил, что для обеспечения инициализации моей инфраструктуры ** idempotent мне нужно иметь возможность проверять пакет из оболочки в oneliner. Я построил ответ на @ cuonglm. Мне пришлось отменить 1 и 0, потому что я создаю статус выхода, а не печатаю строку.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo

Вы можете заменить sys.argv[1] на одиночное цитированное имя вашего пакет, но для моих сценариев инициализации мне нравится читаемость в конце.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"

** Я понимаю, что у шеф-повара, марионетки и всех есть плагины для управления пакетами python, но вы можете найти себя в такой ситуации, как я, где вы используете устаревшую версию и не хотите использовать устаревшие плагины.

1
ответ дан 23 May 2018 в 23:02

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

Похожие вопросы: