Jak sprawdzić, czy moduł jest zainstalowany w Pythonie i zainstalować go w razie potrzeby?

89

W terminalu, po uruchomieniu Pythona, skąd mam wiedzieć, jakie moduły są obecne w Pythonie? Załóżmy, że muszę nauczyć się modułów NumPy i SciPy.

  • Jak mam go zainstalować, jeśli nie jest zainstalowany?
  • Skąd mam wiedzieć, czy jest już zainstalowany?
TechJhola
źródło

Odpowiedzi:

73

Jak sprawdzić, czy moduł python jest zainstalowany w systemie, czy nie: Możesz wykonać bardzo łatwy test w terminalu,

$ 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

Jak mam go zainstalować, jeśli nie jest zainstalowany

Możesz zainstalować określony moduł, pobierając odpowiednie pakiety z repozytorium, na przykład możesz zainstalowaćscipy jako,

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Alternatywnie Możesz również zainstalować moduł python, używając python-pipsugestii Zacka Titana w komentarzu poniżej : Aby zainstalować numpy, możesz użyć

pip install numpy

Ostrzeżenie: Zdecydowanie zaleca się instalowanie modułów python przy użyciu tylko oficjalnego repozytorium Ubuntu i nie używanie tej pipmetody jako administratora (tj. Jako rootlub przy użyciu sudo). W niektórych przypadkach może to spowodować, że Twój system będzie bezużyteczny przez zerwanie pytona systemowego.

Jak instalować pakiety za pomocą piplokalnego środowiska wirtualnego.

souravc
źródło
Jak w twojej odpowiedzi istnieje moduł matematyczny i dla numby ślad nie pojawił się, a dla echa $? wynik wynosił 0, czy to oznacza, że ​​numpy jest również obecny w moim systemie?
TechJhola
1
tak, jest w twoim systemie.
souravc
Jeśli nie masz modułu numpy, jak go zaimportujesz? Kiedy wykonujemy kodowanie, wywołujemy instrukcję importu z numpy import *, czy zainstaluje moduł? Jeśli nie, w jaki sposób zainstalujemy nowy moduł?
TechJhola
1
Będzie to osobne pytanie, jak zainstalować moduł. Potrzebujesz różnych pakietów dla różnych modułów. Na przykład, aby zainstalować vpython, musisz zainstalować jakosudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc
1
nie używaj sudo pip; może to uszkodzić python systemowy. Użyj apt-get, aby zainstalować pakiety dla systemu Python. Możesz użyć pip --useropcji lub virtualenv, aby zainstalować pakiety Pythona dla siebie.
jfs
21

W przypadku, gdy nie chcemy niepotrzebnie importować danego modułu (co miałoby miejsce w tryinstrukcji), możemy skorzystać z sys.modulestestów modułów, które zostały zainstalowane i zostały zaimportowane wcześniej.

W kwestii powłoki pytona:

>>> import sys

Następnie przetestuj zainstalowane moduły:

>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False

Zauważ, że tylko te moduły, które zostały zaimportowane przed Truetym testem, dają w wyniku wszystkie inne moduły (nawet jeśli są zainstalowane)False.

Inną alternatywą tryna importrachunku w konsoli Pythona jest wywołanie wbudowaną help()funkcję. Nie dostarczy dokumentacji dla niezainstalowanych modułów, np

>>> help('scipy')
no Python documentation found for 'scipy'

Wyjście bardzo długich dokumentów pomocy zainstalowanych modułów można przerwać Q.

Teraz, aby zainstalować brakujące moduły, zaleca się korzystanie z zarządzania pakietami Ubuntu (a nie z Pip Pythona), ponieważ potrzebujemy dostępu do konta root, a także, aby zapobiec zepsuciu naszego mocno zależnego od Pythona systemu. Dla danego modułu byłoby to np .:

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Po instalacji możemy je dodać do sys.modulessłownika, importując je raz.

Takkat
źródło
1
Myślę, że to jest najbardziej pytoniczna odpowiedź ....
Grijesh Chauhan
3
Pierwsza część tego jest błędna: sys.moduleszawiera tylko moduły, które zostały już zaimportowane , więc nie jest to niezawodny sposób na sprawdzenie, czy moduł został zainstalowany. Najbardziej wiarygodnym testem jest użycie try/excepti pułapki ImportError, jak już sugerowało kilka innych.
ekhumoro
@ekhumoro - dzięki, zredaguję moją odpowiedź, aby było jaśniej.
Takkat
4
Nadal wydaje się to niewystarczająco jasne. Biorąc pod uwagę, że pytanie dotyczy tego, jak dowiedzieć się, czy moduł jest zainstalowany (nie zaimportowany ), sys.modulesjest całkowicie nieistotne i myślę, że jakakolwiek wzmianka o nim jest myląca. Ale może to tylko ja.
David Z
1
sys.modulesnie ma tu żadnej pomocy.
kot
19

Innym sposobem jest pkgutilmoduł. Działa zarówno z Python 2, jak i 3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

Musisz zastąpić modulenazwą swojego modułu, przykład:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
Cuonglm
źródło
2
Widziałem, jak cofnąłeś niektóre z moich zmian; print()będzie również działał dobrze w Pythonie 2; Jest traktowany jako składnia grupy z parens i nie ma żadnych skutków ubocznych. Tylko wtedy, gdy chcesz dodać wiele elementów (jak w print('a', 'b')tym będzie traktowany jako tuple, w którym potrzebujesz from __future__ import print_function, ale nie ma to zastosowania w tym przypadku, możesz po prostu napisać kod zgodny z przyszłością, dodając pareny (przetestowałem moje zmiany w Python 2 i 3)
Martin Tournoij
@Carpetsmoker: Dziękujemy za zwrócenie uwagi. Cofam się do starej wersji.
cuonglm
To świetna odpowiedź. Dodałem odpowiedź pochodną, ​​która zwraca kod wyjścia / statusu (dla kontroli przepływu skryptu powłoki) i przyjmuje nazwę modułu jako argument wiersza poleceń. askubuntu.com/a/891384/146273
Bruno Bronosky
To się udało! - Po prostu zmień na, exitaby można go było używać w kontekście powłoki:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT
12

Wiem, że OP początkowo poprosił o rozwiązanie po uruchomieniu Pythona, ale poza Pythonem używam pip. Na Ubuntu: sudo apt-get install python-pipjeśli nie jest jeszcze zainstalowany.

Następnie, aby zobaczyć, jakie moduły innych firm są dostępne, po prostu uruchom:

pip freeze

Lub nawet

pip list

Oba pokażą wszystkie zainstalowane moduły i ich wersje.

Jeśli moduł, którego szukasz, nie jest zainstalowany, przez większość czasu możesz go łatwo zainstalować za pomocą pip:

pip install <module-name>

Jeśli nie masz pewności, czy moduł istnieje lub jak nazywa się jego PyPI, użyj pip search:

pip search <keyword>
OozeMeister
źródło
1
Pokaże także, pip show <module-name>czy pakiet jest zainstalowany, np pip show numpy.
Herpes Free Engineer
10

Możesz umieścić kod w środku try, exceptzablokować.

$ 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
Avinash Raj
źródło
6

Aby podać inną odpowiedź, ze względu na zakończenie:

Możesz (ab) użyć tej -mopcji. Z strony podręcznika Pythona:

   -m module-name
          Searches sys.path for the named module and runs the  correspond
          ing .py file as a script.

Co da nam:

$ 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

Ale w przypadku nieistniejących modułów da nam:

$ python2 -m doesnt_exist
/sbin/python2: No module named doesnt_exist

Przydałoby grepsię dopasować do tego:

$ 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

Jest to nieco hackowanie, a nie to, do czego -mbyło przeznaczone; ale jest to metoda, która wymaga najmniej pisania, jeśli chcesz szybkiego testu :-)

Martin Tournoij
źródło
4
grep -qsprawia, że ​​przekierowanie do wartości null staje się niepotrzebne.
muru
3
@muru Yikes! /dev/nullPrzez lata
wpisałem
4

W Pythonie napisałem przykład:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])
Mona Jalal
źródło
3

Sprawdzanie powłoki oneliner (przydatne do udostępniania)

Odkryłem, że aby moje udostępnianie infrastruktury ** było idempotentne, muszę być w stanie sprawdzić pakiet z powłoki w oneliner. Zbudowałem na podstawie odpowiedzi @ cuonglm. Musiałem odwrócić 1i 0ponieważ tworzę status wyjścia zamiast drukowania łańcucha.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo

Możesz zastąpić sys.argv[1]pojedynczą cudzysłowią nazwę swojego pakietu, ale w moich skryptach obsługi administracyjnej podoba mi się czytelność posiadania go na końcu.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"

** Zdaję sobie sprawę, że wszyscy szefowie kuchni , marionetki i ansible mają wtyczki do zarządzania pakietami Pythona, ale możesz znaleźć się w sytuacji takiej jak ja, gdy używasz przestarzałej wersji i nie chcesz używać przestarzałych wtyczek.

Bruno Bronosky
źródło
1

Można również użyć pydoc modules, który można przefiltrować, grepaby znaleźć określony moduł. Dane wyjściowe są wyświetlane w formacie kolumnowym. Jedyną wadą tego podejścia jest to, że obejmie on również pliki Pythona w bieżącym katalogu roboczym. Niemniej jednak używam go osobiście przez większość czasu i jest to jedno z najczęściej cytowanych podejść do tego pokrewnego pytania: https://stackoverflow.com/q/739993/3701431

Sergiy Kolodyazhnyy
źródło
0

Z powłoki Ubuntu, domyślnie bash, tak proste jak

pip list | grep <package-name-Case-Matters>

Przykłady

pip list | grep pywinrm

pip list | grep numpy

A jeśli masz wątpliwości co do sprawy (chociaż myślę, że wszystkie nazwy pakietów są zawsze małe):

pip list | grep [Nn]um[Pp]y  # it works with numpy, Numpy, numPy, and NumPy
xCovelus
źródło