Risposte:
Dovresti usare pip
il list
comando con grep, che elenca solo i pacchetti installati (non tutti i moduli e anche i loro vicini):
pip list | grep -F package_name
Se nome_pacchetto corrisponde a più pacchetti installati, ad esempio la ricerca di boto
quando botocore
è installato anche, l'utilizzo di al -w
posto di -F
può aiutare, come suggerisce @TaraPrasadGurung. Questo non elenca il pacchetto esatto, poiché -w
vede i caratteri comuni nei nomi dei pacchetti come limiti di parole. Quindi, se si dispone requests
e requests-cache
installato o ruamel.yaml
e ruamel.yaml.cmd` e hanno bisogno esattamente una riga di output è necessario fare qualcosa di simile:
pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "
Si noti che poiché .
corrisponde a qualsiasi personaggio durante l'utilizzo -E
, è necessario fuggire .¹
¹ E sì, è necessario in quanto esiste un pacchetto ruamel_yaml
. Non tutti i gestori di pacchetti sono pip
compatibili quando si tratta di pacchetti di spazi dei nomi.
-w
come limiti di parole e sono comuni nei nomi dei pacchetti. Ottengo più corrispondenze quando utilizzo il tuo suggerimento utilizzando grep -w ruamel.yaml
ogrep -w request
pip list | grep -F mxnet-cu101
stampa mxnet-cu101 1.5.0
, ma non esattamente dove è installato. qualche idea su come ottenere il percorso installato? `
Ho trovato le risposte esistenti incomplete e prive di esempi abbastanza validi. Ecco la soluzione su cui ho optato:
# 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
Una sintesi di Github di questo esempio è disponibile qui: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6
Puoi anche usare qualcosa di simile nei tuoi script.
python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
Cosa otterrai quando un pacchetto non è installato.
Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1
Cosa otterrai quando viene installato un pacchetto.
Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0
Funziona in python2 e python3, quindi si installa in base al codice di uscita.
Ho usato una versione leggermente più rigorosa della risposta di Anthon, da usare in una sceneggiatura:
pip3 list |
grep -v "^Package *Version$" | grep -v "^-*$" |
cut -d ' ' -f 1 |
grep -xF "$package_name"
I primi due greps hanno lo scopo di eliminare le righe di intestazione dall'output di pip3.
Il taglio quindi seleziona solo i nomi dei pacchetti (scartando i numeri di versione).
Quindi il grep finale può eseguire una ricerca esatta del pertinente $package_name
Se il pacchetto viene trovato, verrà visualizzato il nome del pacchetto e verrà restituito con il codice di uscita 0. Se non si desidera visualizzare il nome del pacchetto, terminare il comando con >/dev/null
in una shell / prompt di Python. :
>>> help('modules')
Testato con pip3:
$> pip3 show MODULENAME
Il codice di uscita ($?) Sarebbe "0" nel caso in cui il modulo sia installato, altrimenti "1".
Grepping ha il problema dei "falsi positivi": l'output di a
pip list | grep NAME
corrisponderebbe a qualsiasi modulo il cui nome contenga "NAME", ad esempio corrisponda anche a "some_other_NAME".
Mentre
pip3 show MODULENAME
solo partite su partite complete.
pip install
. Se è già installato, non lo installerà di nuovo.