Musisz sprawdzić, czy jest zainstalowany, czy nie, zanim program będzie mógł działać.
Musisz sprawdzić, czy jest zainstalowany, czy nie, zanim program będzie mógł działać.
Odpowiedzi:
Należy użyć pip
„s list
komendę 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, boto
kiedy botocore
jest również zainstalowany, użycie -w
zamiast zamiast -F
może pomóc, jak sugeruje @TaraPrasadGurung. Nie podaje to dokładnego pakietu, ponieważ -w
znaki wspólne w nazwach pakietów stanowią granice słów. Więc jeśli masz requests
i requests-cache
zainstalowałeś lub ruamel.yaml
ruamel.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 pip
kompatybilny w przypadku pakietów przestrzeni nazw.
-w
jako granice słów i są powszechne w nazwach pakietów. Dostaję wiele dopasowań, gdy używam Twojej sugestii przy użyciu grep -w ruamel.yaml
lubgrep -w request
pip list | grep -F mxnet-cu101
drukuje mxnet-cu101 1.5.0
, ale nie dokładnie tam, gdzie jest zainstalowany. jakiś pomysł, jak uzyskać zainstalowaną ścieżkę? `
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
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.
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
w powłoce Pythona / znaku zachęty. :
>>> help('modules')
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ń.
pip install
. Jeśli jest już zainstalowany, nie zainstaluje go ponownie.