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


89

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

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

Ответы:


73

Как узнать, установлен ли модуль 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 Python2
sudo apt-get install python3-scipy ## for Python3

Кроме того, вы также можете установить модуль Python, используя, python-pipкак это было предложено Zack Titan в комментарии ниже , для установки numpyвы можете использовать

pip install numpy

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

Как установить пакеты используя pipв локальной виртуальной среде.


Как и в вашем ответе математический модуль существует, и для онемения трассировка не появилась и для echo $? выходной был 0, это означает, что NumPy также присутствует в моей системе?
TechJhola

1
да, это есть в вашей системе.
souravc

Если у вас нет модуля numpy, как вы будете его импортировать? Когда мы выполняем кодирование, которое мы вызываем оператором импорта из numpy import *, установит ли он модуль? Если нет, то как мы будем устанавливать новый модуль?
TechJhola

1
Это будет отдельный вопрос, как установить модуль. Нужны разные пакеты для разных модулей. Например, для установки vpythonвам необходимо установить его какsudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc

1
не использовать sudo pip; это может сломать системный питон. Используйте apt-get для установки пакетов для системного Python. Вы можете использовать pip --useroption или virtualenv для установки пакетов Python для себя.
JS

21

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

В выпуске оболочки Python:

>>> import sys

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

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

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

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

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

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

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

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

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


1
Я думаю, что это самый Pythonic ответ ....
Grijesh Chauhan

3
Первая часть неверна: sys.modulesсодержит только модули, которые уже были импортированы , поэтому это не надежный способ проверить, был ли установлен модуль. Самый надежный тест - использовать try/exceptи перехватывать ImportError, как уже предлагали несколько других.
Эхуморо

@ekhumoro - спасибо, я отредактирую свой ответ, чтобы прояснить ситуацию.
Таккат

4
Это все еще кажется недостаточно ясным. Учитывая , что вопрос с вопросом , как выяснить , если модуль установлен (не импортируется ), sys.modulesсовершенно не имеет значения , и я думаю , что любое упоминание о нем в заблуждение. Но, возможно, это только я.
Дэвид Z

1
sys.modulesздесь нет никакой помощи
кот

19

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

2
Я видел, как вы отменили некоторые из моих изменений; print()также будет хорошо работать в Python 2; Он рассматривается как синтаксис «группа с паренями» и не имеет побочных эффектов. Только когда вы хотите добавить несколько элементов (как print('a', 'b')это будет рассматриваться как элемент tuple, в котором вы действительно нуждаетесь from __future__ import print_function, но в данном случае это неприменимо), вы можете просто написать код, совместимый с прямым переходом, добавив символы скобок (я проверил свои изменения в Python 2 и 3)
Мартин Турной

@Carpetsmoker: Спасибо за указание. Я откатился на старую версию.
Cuonglm

Это отличный ответ. Я добавил производный ответ, который возвращает код выхода / состояния (для управления потоком сценария оболочки) и принимает имя модуля в качестве аргумента командной строки. askubuntu.com/a/891384/146273
Бруно Броноски

Это сработало! - Просто изменится , exitпоэтому он может быть использован в контексте оболочки:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT

12

Я знаю, что 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>

1
Также pip show <module-name>покажет, установлен ли пакет, например pip show numpy.
Инженер герпеса

10

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

6

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

Вы можете (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

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


4
grep -qделает перенаправление на нуль ненужным.
Муру

3
@muru Yikes! За эти годы я набрал много бесполезных перенаправлений /dev/null: - /
Мартин Турной

4

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

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])

3

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

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

** Я понимаю, что у chef , puppet и ansible есть плагины для управления пакетами Python, но вы можете оказаться в такой ситуации, как я, когда вы используете устаревшую версию и не хотите использовать устаревшие плагины.


1

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


0

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

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

Примеры

pip list | grep pywinrm

pip list | grep numpy

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.