Ответы:
Как узнать, установлен ли модуль 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
в локальной виртуальной среде.
vpython
вам необходимо установить его какsudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
sudo pip
; это может сломать системный питон. Используйте apt-get для установки пакетов для системного Python. Вы можете использовать pip --user
option или virtualenv для установки пакетов Python для себя.
В случае, если мы не хотим нежелательно импортировать соответствующий модуль (что может произойти в 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
словарь, импортировав их один раз.
sys.modules
содержит только модули, которые уже были импортированы , поэтому это не надежный способ проверить, был ли установлен модуль. Самый надежный тест - использовать try/except
и перехватывать ImportError
, как уже предлагали несколько других.
sys.modules
совершенно не имеет значения , и я думаю , что любое упоминание о нем в заблуждение. Но, возможно, это только я.
sys.modules
здесь нет никакой помощи
Другим способом является 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
print()
также будет хорошо работать в Python 2; Он рассматривается как синтаксис «группа с паренями» и не имеет побочных эффектов. Только когда вы хотите добавить несколько элементов (как print('a', 'b')
это будет рассматриваться как элемент tuple
, в котором вы действительно нуждаетесь from __future__ import print_function
, но в данном случае это неприменимо), вы можете просто написать код, совместимый с прямым переходом, добавив символы скобок (я проверил свои изменения в Python 2 и 3)
Я знаю, что 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>
pip show <module-name>
покажет, установлен ли пакет, например pip show numpy
.
Вы можете поместить код внутри 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
опцию. С 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
для чего он был предназначен; но это метод, который требует наименьшего набора текста, если вы хотите быстрый тест :-)
grep -q
делает перенаправление на нуль ненужным.
/dev/null
: - /
Я написал пример на Python:
import pip
import sys
from bigml.api import BigML
if not 'bigml' in sys.modules.keys():
pip.main(['install', 'bigml'])
Я обнаружил, что для того, чтобы сделать инфраструктуру ** идемпотентной, мне нужно иметь возможность проверить пакет из оболочки в 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, но вы можете оказаться в такой ситуации, как я, когда вы используете устаревшую версию и не хотите использовать устаревшие плагины.
Можно также использовать pydoc modules
, который может быть отфильтрован, grep
чтобы найти конкретный модуль. Вывод отображается в столбчатом формате. Единственным недостатком этого подхода является то, что он также будет включать файлы Python в текущий рабочий каталог. Тем не менее, я использую его сам большую часть времени, и это один из наиболее цитируемых подходов по этому связанному вопросу: https://stackoverflow.com/q/739993/3701431
Из оболочки 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
На момент написания этого, pip show ...
кажется, самый простой способ:
https://pip.pypa.io/en/stable/reference/pip_show/
Но он молчит (т.е. ничего не возвращает), когда пакет не установлен.