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

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

  • Как я его установлю, если он не установлен?
  • Как я узнаю, установлен ли он уже?

Как узнать, установлен ли в системе модуль python или нет: Вы можете выполнить очень простой тест в терминале,

$ python -c "import math"$ echo $?0                                # math module exists in system$ python -c "import numpy"Traceback (most recent call last):  File "<string>", line 1, in <module>ImportError: No module named numpy$ echo $?1                                # numpy module does not exist in system

Как я его установлю, если он не установлен

Вы можете установить определенный модуль, загрузив соответствующие пакеты из репозитория, например, вы можете устанавливать scipy как,

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

Попеременно Вы также можете установить модуль python с помощью python-pip как было предложено Заком Титаном в комментарий ниже, Для установки numpy Вы можете использовать

pip install numpy

Предупреждение: Настоятельно рекомендуется устанавливать python-модули только с использованием официального репозитория Ubuntu и не использовать pip способ, как суперпользователь(то есть, как root или с помощью sudo). В некоторых случаях это может сделать вашу систему непригодной для использования, нарушив системный python.

Как установить пакеты с помощью pip в локальную виртуальную среду.

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

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

>>> import sys

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

>>> 'numpy' in sys.modulesTrue>>> 'scipy' in sys.modulesFalse

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

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

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

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

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

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

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

Другой способ - это pkgutil модуль. Работает как с Python 2, так и с Python 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

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

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

pip freeze

Или даже

pip list

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

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

pip install <module-name>

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

pip search <keyword>

Вы могли бы поместить код внутрь 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

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

Вы можете (ab) использовать -m вариант. Из справочной страницы 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

Мы могли бы использовать 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 был предназначен для; но это метод, который требует наименьшего набора текста, если вы хотите быстрый тест :-)

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

import pipimport sysfrom bigml.api import BigMLif not 'bigml' in sys.modules.keys():    pip.main(['install', 'bigml'])

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

Я обнаружил, что для того, чтобы сделать мою инфраструктуру provisioning ** идемпотентной, мне нужно иметь возможность проверять наличие пакета из командной строки в 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, но вы можете оказаться в ситуации, подобной моей, когда вы используете устаревшую версию и не хотите использовать устаревшие плагины.

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

Из оболочки Ubuntu, по умолчанию bash, так же просто, как

pip list | grep <package-name-Case-Matters>

Примеры

pip list | grep pywinrmpip list | grep numpy

И, если у вас есть сомнения по поводу этого случая (хотя я думаю, что все имена пакетов всегда в нижнем регистре):

pip list | grep [Nn]um[Pp]y  # it works with numpy, Numpy, numPy, and NumPy