Come verificare se un modulo o un pacchetto è già installato in python3?


10

È necessario verificare se è installato o meno prima che il programma possa essere eseguito.


2
Basta eseguire il pip install. Se è già installato, non lo installerà di nuovo.
Giordano,

Grazie jordanm, ma ho bisogno di controllare e dare ao / p quindi test.
Hubatrix,

Risposte:


3

Digitare nella shell: pydoc modules.
Questo elencherà i moduli e puoi grep il modulo che desideri.
Trovato su StackOverflow qui


11

Dovresti usare pipil listcomando 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 botoquando botocoreè installato anche, l'utilizzo di al -wposto di -Fpuò aiutare, come suggerisce @TaraPrasadGurung. Questo non elenca il pacchetto esatto, poiché -wvede i caratteri comuni nei nomi dei pacchetti come limiti di parole. Quindi, se si dispone requestse requests-cacheinstallato o ruamel.yamle 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 pipcompatibili quando si tratta di pacchetti di spazi dei nomi.


Il problema è che se sono installati il ​​nome del pacchetto boto e botocore, verranno elencati entrambi. Quindi la soluzione migliore sarà usare -w flag invece di -F per elencare il pacchetto esatto
Tara Prasad Gurung

@TaraPrasadGurung Sebbene ciò possa aiutare a ridurre in qualche modo l'output, non aiuta a ottenere il pacchetto esatto come si afferma. Ad esempio il punto e il trattino sono presi -wcome limiti di parole e sono comuni nei nomi dei pacchetti. Ottengo più corrispondenze quando utilizzo il tuo suggerimento utilizzando grep -w ruamel.yamlogrep -w request
Anthon,

pip list | grep -F mxnet-cu101stampa mxnet-cu101 1.5.0, ma non esattamente dove è installato. qualche idea su come ottenere il percorso installato? `
Anu,

@Sì, ho una buona idea su come recuperare dove è installato un pacchetto Python dato che conosco il suo nome. Dovresti pubblicare una domanda su questo sito e fare un ping qui per la mia attenzione quando lo fai, poiché non seguo le domande appena pubblicate su U&L.
Anthon,

4

Se il pacchetto non fa qualcosa di folle o richiede molto tempo durante l'importazione, puoi provare a importarlo effettivamente:

if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fi

2

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


sembra molto simile a una risposta esistente
Jeff Schaller

1
Il codice bash è simile, il codice Python è diverso, il che fa la differenza. Ho letto tutte le risposte esistenti prima di scegliere di aggiungere la mia e la risposta specifica a cui hai collegato non ha funzionato per me. Pertanto, trovo pertinente e utile aggiungere la mia risposta qui. :)
ShayPal5,

1

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.


0

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



0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.