Jak sprawdzić, czy moduł lub pakiet jest już zainstalowany w python3?

10

Musisz sprawdzić, czy jest zainstalowany, czy nie, zanim program będzie mógł działać.

hubatrix
źródło
2
Po prostu uruchom pip install. Jeśli jest już zainstalowany, nie zainstaluje go ponownie.
jordanm,
Dziękuję jordanm, ale muszę sprawdzić i dać A / P, a następnie testowanie.
hubatrix 10.10.15

Odpowiedzi:

3

Wpisz w powłoce: pydoc modules.
Spowoduje to wyświetlenie listy modułów i możesz grepować moduł, który chcesz.
Znalezione w stackoverflow tutaj

labirynty
źródło
11

Należy użyć pip„s listkomendę grep, że tylko listy zainstalowanych pakietów (nie wszystkie moduły i ich sąsiedzi również):

pip list | grep -F package_name

Jeśli nazwa_pakietu pasuje do wielu zainstalowanych pakietów, np. Wyszukiwanie, botokiedy botocorejest również zainstalowany, użycie -wzamiast zamiast -Fmoże pomóc, jak sugeruje @TaraPrasadGurung. Nie podaje to dokładnego pakietu, ponieważ -wznaki wspólne w nazwach pakietów stanowią granice słów. Więc jeśli masz requestsi requests-cachezainstalowałeś lub ruamel.yamlruamel.yaml.cmd` i potrzebujesz dokładnie jednej linii danych wyjściowych , musisz zrobić coś takiego:

pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "

Pamiętaj, że ponieważ .podczas używania pasuje do dowolnej postaci -E, musisz uciec .¹


¹ Tak, jest to konieczne, ponieważ istnieje paczka ruamel_yaml. Nie każdy menedżer pakietów jest pipkompatybilny w przypadku pakietów przestrzeni nazw.

Anthon
źródło
Problem polega na tym, że jeśli zainstalowana jest nazwa pakietu boto i botocore, wyświetli ona oba z nich. Lepszym rozwiązaniem będzie więc użycie opcji -w zamiast opcji -F, aby wyświetlić dokładny pakiet
Tara Prasad Gurung
@TaraPrasadGurung Chociaż może to nieco zmniejszyć wydajność, nie pomaga uzyskać dokładnego pakietu, jak twierdzisz. Np. Kropka i myślnik są traktowane -wjako granice słów i są powszechne w nazwach pakietów. Dostaję wiele dopasowań, gdy używam Twojej sugestii przy użyciu grep -w ruamel.yamllubgrep -w request
Anthon
pip list | grep -F mxnet-cu101drukuje mxnet-cu101 1.5.0, ale nie dokładnie tam, gdzie jest zainstalowany. jakiś pomysł, jak uzyskać zainstalowaną ścieżkę? `
Anu
@ każdy Tak, mam dobry pomysł, jak pobrać, gdzie jest zainstalowany pakiet Python, biorąc pod uwagę jego nazwę. Powinieneś opublikować pytanie na tej stronie i pingować mnie tutaj o moją uwagę, kiedy to zrobię, ponieważ nie śledzę nowo opublikowanych pytań na U&L.
Anthon
4

Jeśli pakiet nie robi czegoś szalonego lub czasochłonnego podczas importu, możesz spróbować go zaimportować:

if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fi
Dmitry
źródło
2

Stwierdziłem, że istniejące odpowiedzi są niepełne i brakuje wystarczająco dobrych przykładów. Oto rozwiązanie, na którym się zdecydowałem:

# an example checking if the pandas package is installed
if python -c 'import pkgutil; exit(not pkgutil.find_loader("pandas"))'; then
    echo 'pandas found'
else
    echo 'pandas not found'
fi

Zestawienie Github tego przykładu można znaleźć tutaj: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6

ShayPal5
źródło
wygląda to bardzo podobnie do istniejącej odpowiedzi
Jeff Schaller
1
Kod bash jest podobny, kod Pythona jest inny, co robi spore różnice. Przeczytałem wszystkie istniejące odpowiedzi, zanim zdecydowałem się dodać własne, a konkretna odpowiedź, do której linkujesz, nie działała dla mnie. Dlatego uważam za istotne i cenne dodanie tutaj mojej odpowiedzi. :)
ShayPal5,
1

Możesz również użyć czegoś takiego w swoich skryptach.

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

Co otrzymasz, gdy pakiet nie zostanie zainstalowany.

Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1

Co otrzymasz, gdy pakiet zostanie zainstalowany.

Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0

Działa w python2 i python3, a następnie instalujesz na podstawie kodu wyjścia.

RJ
źródło
0

Użyłem nieco bardziej rygorystycznej wersji odpowiedzi Anthon, do użycia w skrypcie:

pip3 list |
    grep -v "^Package *Version$" | grep -v "^-*$" |
    cut -d ' ' -f 1 |
    grep -xF "$package_name"

Pierwsze dwa grepy mają na celu usunięcie linii nagłówka z wyjścia pip3.

Wycięcie następnie wybiera tylko nazwy pakietów (odrzucając numery wersji).

Następnie końcowy grep może przeprowadzić dokładne wyszukiwanie odpowiedniego $package_name

Jeśli pakiet zostanie znaleziony, wyświetli nazwę pakietu i zwróci kod wyjścia 0. Jeśli nie chcesz widzieć nazwy pakietu, zakończ komendę >/dev/null

joeytwiddle
źródło
0

w powłoce Pythona / znaku zachęty. :

>>> help('modules')
Metoda naukowa
źródło
0

Testowane z pip3:

$> pip3 show MODULENAME

Kod wyjścia ($?) Byłby „0” w przypadku zainstalowania modułu, w przeciwnym razie „1”.

Grepping ma problem „fałszywych alarmów”: Wyjście a

pip list | grep NAME

pasuje do każdego modułu, którego nazwa zawiera „NAME”, np. również pasuje do „some_other_NAME”.

Podczas

pip3 show MODULENAME

pasuje tylko do kompletnych dopasowań.

Thomas Hofmann
źródło