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

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

  • Как я установлю его, если это не будет установлено?
  • Как я буду знать, установлено ли это уже?
105
задан 16 August 2018 в 11:17

13 ответов

Как узнать, установлен ли модуль 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 , как было предложено Заком Титаном в комментарии ниже . Чтобы установить numpy , вы можете использовать

pip install numpy

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

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

85
ответ дан 22 November 2019 в 23:08

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

В случае с оболочкой python:

>>> import sys

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

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

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

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

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

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

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

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

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

26
ответ дан 22 November 2019 в 23:08

Другой способ - модуль 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
19
ответ дан 22 November 2019 в 23:08

Я знаю, что 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>
13
ответ дан 22 November 2019 в 23:08

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

$ 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
11
ответ дан 22 November 2019 в 23:08

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

Вы можете (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 ; но это метод, требующий минимального набора текста, если вы хотите провести быструю проверку: -)

7
ответ дан 22 November 2019 в 23:08

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

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])
4
ответ дан 22 November 2019 в 23:08

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

1
ответ дан 22 November 2019 в 23:08

Из 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
1
ответ дан 22 November 2019 в 23:08

На момент написания этой статьи пип-шоу ... кажется самым простым способом: https://pip.pypa.io/en/stable/reference/pip_show/

Но он молчит (т.е. ничего не возвращает), когда пакет не установлен.

0
ответ дан 22 November 2019 в 23:08

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

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

3
ответ дан 22 November 2019 в 23:08

Я бы сделал что-то вроде этого:

#!/bin/bash

pymodules=(
    requests
    termcolor
)

for module in "${pymodules[@]}"; do
    if python3 -c "import pkgutil; exit(1 if pkgutil.find_loader(\"$module\") else 0)"; then
        pip3 install --user "$module"
    fi
done

Он установит любой модуль, который отсутствует в массиве pymodules .

Используя - user делает пакеты установки pip в вашем домашнем каталоге, а не в системном каталоге, таком как /usr/local/lib/python3.7/ , это полезно, поскольку не требует каких-либо особых привилегий и поддерживает чистую установку вашей системы .

0
ответ дан 5 January 2021 в 22:57

вот что я придумал:

if [[ ! $(pip list|grep "numpy") ]]; then
    pip install numpy
fi

Он проверит, установлен ли numpy в вашей системе, если нет, он установит numpy с помощью pip.

0
ответ дан 5 January 2021 в 22:57

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

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