В терминале, после того, как я запускаю 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 Python2
sudo 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.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
, импортировав их один раз.
Другой способ - модуль 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
Я знаю, что 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
, кроме блока
.
$ 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 pip
import sys
from bigml.api import BigML
if not 'bigml' in sys.modules.keys():
pip.main(['install', 'bigml'])
Также можно использовать модули pydoc
, которые можно отфильтровать с помощью 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
На момент написания этой статьи пип-шоу ...
кажется самым простым способом:
https://pip.pypa.io/en/stable/reference/pip_show/
Но он молчит (т.е. ничего не возвращает), когда пакет не установлен.
Я обнаружил, что для создания моей инфраструктуры 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, но вы можете оказаться в такой же ситуации, как я, когда вы используете устаревшую версию и не хотите использовать устаревшие плагины.
Я бы сделал что-то вроде этого:
#!/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/
, это полезно, поскольку не требует каких-либо особых привилегий и поддерживает чистую установку вашей системы .
вот что я придумал:
if [[ ! $(pip list|grep "numpy") ]]; then
pip install numpy
fi
Он проверит, установлен ли numpy в вашей системе, если нет, он установит numpy с помощью pip.