Відповіді:
Як дізнатися, встановлений чи не модуль 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/excepttrap та 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/
Але він беззвучний (тобто нічого не повертає), коли пакет не встановлений.