Odpowiedzi:
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
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-pip
sugestii 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 pip
metody jako administratora (tj. Jako root
lub 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ą pip
lokalnego środowiska wirtualnego.
vpython
, musisz zainstalować jakosudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
sudo pip
; może to uszkodzić python systemowy. Użyj apt-get, aby zainstalować pakiety dla systemu Python. Możesz użyć pip --user
opcji lub virtualenv, aby zainstalować pakiety Pythona dla siebie.
W przypadku, gdy nie chcemy niepotrzebnie importować danego modułu (co miałoby miejsce w try
instrukcji), możemy skorzystać z sys.modules
testó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 True
tym testem, dają w wyniku wszystkie inne moduły (nawet jeśli są zainstalowane)False.
Inną alternatywą try
na import
rachunku 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.modules
słownika, importując je raz.
sys.modules
zawiera 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/except
i pułapki ImportError
, jak już sugerowało kilka innych.
sys.modules
jest całkowicie nieistotne i myślę, że jakakolwiek wzmianka o nim jest myląca. Ale może to tylko ja.
sys.modules
nie ma tu żadnej pomocy.
Innym sposobem jest pkgutil
moduł. 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ć module
nazwą swojego modułu, przykład:
$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
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)
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-pip
jeś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>
pip show <module-name>
czy pakiet jest zainstalowany, np pip show numpy
.
Możesz umieścić kod w środku try
, except
zablokować.
$ 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
Aby podać inną odpowiedź, ze względu na zakończenie:
Możesz (ab) użyć tej -m
opcji. 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 grep
się 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 -m
było przeznaczone; ale jest to metoda, która wymaga najmniej pisania, jeśli chcesz szybkiego testu :-)
grep -q
sprawia, że przekierowanie do wartości null staje się niepotrzebne.
/dev/null
Przez lata
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'])
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ć 1
i 0
ponieważ 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.
Można również użyć pydoc modules
, który można przefiltrować, grep
aby 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
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
W chwili pisania tego pip show ...
wydaje się być najprostszym sposobem:
https://pip.pypa.io/en/stable/reference/pip_show/
Ale milczy (tzn. Nic nie zwraca), gdy pakiet nie jest zainstalowany.