Відповіді:
Як дізнатися, встановлений чи не модуль 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
). У деяких випадках він може залишити вашу систему непридатною, порушивши системний пітон.
Як встановити пакети з використанням pip
у локальне віртуальне середовище.
vpython
вам потрібно встановити його якsudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
sudo pip
; він може зламати системний пітон. Використовуйте apt-get для встановлення пакетів для системного пітона. Ви можете скористатися pip --user
опцією або virtualenv для установки пакетів Python для себе.
У випадку, якщо ми не хочемо імпортувати відповідний модуль (що трапиться в try
заяві), ми можемо скористатися sys.modules
тестуванням модулів, які були встановлені та імпортовані раніше.
У питанні оболонки пітона:
>>> 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 (а не спосіб Pyphon pip), оскільки нам потрібен кореневий доступ, а також для запобігання збиттю нашої сильно залежної від Python системи. Для розглянутого модуля це, наприклад, буде:
sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3
Після установки ми можемо додавати їх до sys.modules
словника, імпортуючи їх один раз.
sys.modules
містить лише модулі, які вже були імпортовані , тому це не є надійним способом перевірити, чи встановлений модуль. Найбільш надійний тест - це використовувати a try/except
trap та 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).
Я знаю, що ОР спочатку просила рішення після запуску 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
Щоб надати ще одну відповідь, для завершення:
Ви можете (аб) використовувати -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
було призначено; але це метод, який вимагає найменшого набору тексту, якщо потрібно швидкий тест :-)
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'])
Я виявив, що для того, щоб зробити моє резервування інфраструктури ** 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)"
** Я усвідомлюю, що у всіх шеф-кухарів , маріонеток та інших людей є додатки для керування пакунками python, але ви можете опинитися в такій ситуації, як я, коли ви використовуєте застарілу версію і не хочете використовувати застарілі плагіни.
Можна також використати pydoc modules
, за допомогою якого можна відфільтрувати, grep
щоб знайти конкретний модуль. Вихід відображається в колонному форматі. Єдиним недоліком такого підходу є те, що він також буде включати файли python у поточну робочу директорію. Тим не менше, я його використовую більшу частину часу, і це один із високо цитованих підходів до цього пов'язаного питання: https://stackoverflow.com/q/739993/3701431
З Shell 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/
Але він беззвучний (тобто нічого не повертає), коли пакет не встановлений.