Як перевірити, чи встановлений модуль в Python, і встановити його за потреби?


89

Після закінчення запуску Python, як я дізнаюся, які модулі є в python? Припустимо, мені потрібно вивчити модулі NumPy та SciPy.

  • Як встановити його, якщо він не встановлений?
  • Як я дізнаюся, чи він уже встановлений?

Відповіді:


73

Як дізнатися, встановлений чи не модуль 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у локальне віртуальне середовище.


Як у вашому модулі математики відповідей існує, і для numby відстеження не з'явилося і для echo $? Вихід був 0, Це означає, що numpy також присутній у моїй системі?
TechJhola

1
так, він є у вашій системі.
souravc

Якщо у вас немає модуля numpy, як його імпортувати? Коли ми робимо кодування, ми називаємо оператор import від numpy import *, чи встановить він модуль? Якщо ні, то як ми встановимо новий модуль?
TechJhola

1
Виникне питання про те, як встановити модуль. Потрібні різні пакети для різних модулів. Наприклад, для встановлення vpythonвам потрібно встановити його якsudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc

1
не використовувати sudo pip; він може зламати системний пітон. Використовуйте apt-get для встановлення пакетів для системного пітона. Ви можете скористатися pip --userопцією або virtualenv для установки пакетів Python для себе.
jfs

21

У випадку, якщо ми не хочемо імпортувати відповідний модуль (що трапиться в 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словника, імпортуючи їх один раз.


1
Я думаю, що це найбільш піфонічна відповідь ....
Гріеш Чаухан

3
Перша частина цього помилкова: sys.modulesмістить лише модулі, які вже були імпортовані , тому це не є надійним способом перевірити, чи встановлений модуль. Найбільш надійний тест - це використовувати a try/excepttrap та ImportError, як уже запропонували декілька інших.
ekhumoro

@ekhumoro - дякую, я відредагую свою відповідь, щоб зробити це зрозумілішим.
Таккат

4
Це все ще здається недостатньо зрозумілим. З огляду на , що питання з питанням , як з'ясувати , якщо модуль встановлений (Не імпортується ), sys.modulesабсолютно не має значення , і я думаю , що будь-яка згадка про нього в оману. Але, можливо, це тільки я.
David Z

1
sys.modulesтут не допомога.
кіт

19

Інший спосіб - це 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

2
Я бачив, як ти розв’язав деякі мої зміни; print()також буде добре працювати в Python 2; Це трактується як синтаксис групи з паронами і не має жодних побічних ефектів. Тільки тоді, коли ви хочете додати кілька елементів (оскільки в print('a', 'b')ньому буде розглядатися як до tuple, у якому вам потрібно from __future__ import print_function, але це не застосовується в цьому випадку, ви можете просто написати сумісний з прямим кодом додавання паролів (я перевірив свої зміни в Python 2 і 3).
Мартін Турной

@Carpetsmoker: Дякую, що вказали. Я відкат до старої версії.
cuonglm

Це чудова відповідь. Я додав похідну відповідь, яка повертає код виходу / стану (для управління потоком сценарію оболонки) і приймає ім'я модуля як аргумент командного рядка. askubuntu.com/a/891384/146273
Бруно Броноський

Це спрацювало! - Просто зміниться , exitтому він може бути використаний в контексті оболонки:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT

12

Я знаю, що ОР спочатку просила рішення після запуску 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>

1
Також pip show <module-name>буде показано, чи встановлений пакет, наприклад pip show numpy.
Вільний інженер з герпесу

10

Ви можете помістити код всередину 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

6

Щоб надати ще одну відповідь, для завершення:

Ви можете (аб) використовувати -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було призначено; але це метод, який вимагає найменшого набору тексту, якщо потрібно швидкий тест :-)


4
grep -qробить перенаправлення на нуль непотрібним.
муру

3
@muru Yikes! Я набрав багато непотрібних переадресацій /dev/nullпротягом багатьох років: - /
Мартін Турной

4

Я написав приклад в Python:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])

3

Перевірка одноколірної оболонки (корисна для забезпечення)

Я виявив, що для того, щоб зробити моє резервування інфраструктури ** 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, але ви можете опинитися в такій ситуації, як я, коли ви використовуєте застарілу версію і не хочете використовувати застарілі плагіни.


1

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


0

З 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.