Come posso verificare se un modulo è installato in Python e installarlo se necessario?

66

Nel terminale, dopo aver avviato Python, come faccio a sapere quali sono i moduli presenti in python? Supponiamo di dover imparare i moduli NumPy e SciPy.

  • Come lo installerò se non è installato?
  • Come faccio a sapere se è già installato?
posta TechJhola 22.02.2015 - 04:09

9 risposte

56

Come sapere se un modulo python è installato o meno nel sistema: puoi eseguire un test molto semplice nel terminale,

$ 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

Come lo installerò se non è installato

Puoi installare un modulo specifico scaricando i rispettivi pacchetti dal repository, ad esempio puoi installare scipy come,

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

In alternativa puoi anche installare un modulo python usando python-pip come suggerito da Zack Titan in commento sotto , per installare numpy puoi usare

pip install numpy

Avviso: si consiglia vivamente di installare i moduli python usando solo il repository ufficiale di Ubuntu e di non utilizzare il metodo pip come superuser (cioè come root o utilizzando sudo ). In alcuni casi potrebbe rendere inutilizzabile il sistema interrompendo il sistema python.

Come installare i pacchetti utilizzando pip nell'ambiente virtuale locale.

    
risposta data souravc 22.02.2015 - 04:28
20

Se non vogliamo importare involontariamente un modulo in questione (cosa che accadrebbe in un'istruzione try ) possiamo utilizzare sys.modules per testare i moduli che sono installati e sono stati importato prima.

Nel problema della shell python:

>>> import sys

Quindi verifica i moduli installati:

>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False

Nota che solo quei moduli che sono stati importati prima danno True a questo test, tutti gli altri moduli (anche se installati) risultano in False.

Un'altra alternativa all'istruzione try an import nella console python chiama la funzione help() incorporata. Ciò non fornirà una documentazione per i moduli non installati, ad es.

>>> help('scipy')
no Python documentation found for 'scipy'

L'output di documenti di help molto lunghi dei moduli installati può essere interrotto con Q .

Ora per installare i moduli mancanti si consiglia di utilizzare la gestione dei pacchetti Ubuntu (e non il modo pip Python) perché abbiamo bisogno dell'accesso root e anche per evitare di rovinare il nostro sistema fortemente dipendente da Python. Per il modulo in questione, ad es. essere:

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Dopo l'installazione, possiamo aggiungerli al dizionario sys.modules importandoli una volta.

    
risposta data Takkat 22.02.2015 - 12:23
16

Un altro modo è il modulo pkgutil . Funziona con entrambi Python 2 e amp; 3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

Devi sostituire module con il nome del tuo modulo, ad esempio:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
    
risposta data cuonglm 22.02.2015 - 20:53
9

Potresti inserire il codice dentro try , except block.

$ 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
    
risposta data Avinash Raj 22.02.2015 - 08:56
9

So che l'OP inizialmente aveva richiesto una soluzione dopo aver avviato Python, ma al di fuori di python uso pip . Su ubuntu: sudo apt-get install python-pip , se non è già installato.

Quindi per vedere quali moduli di terze parti sono disponibili, esegui semplicemente:

pip freeze

O anche

pip list

Entrambi mostreranno tutti i moduli installati e le loro versioni.

Se il modulo che stai cercando non è installato, la maggior parte delle volte puoi installarlo facilmente con pip:

pip install <module-name>

Se non sei sicuro della presenza di un modulo o del suo nome PyPI, utilizza pip search :

pip search <keyword>
    
risposta data OozeMeister 23.02.2015 - 03:13
6

Per fornire un'altra risposta, a fini di completamento:

Puoi (ab) usare l'opzione -m . Dalla pagina di manuale di Python:

   -m module-name
          Searches sys.path for the named module and runs the  correspond‐
          ing .py file as a script.

Che ci darà:

$ 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

Ma per moduli inesistenti, ci darà:

$ python2 -m doesnt_exist
/sbin/python2: No module named doesnt_exist

Potremmo usare grep per farlo corrispondere a questo:

$ 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

Questo è un po 'hack-ish, e non per cosa era stato progettato -m ; ma è il metodo che richiede la minima digitazione se si desidera un test rapido: -)

    
risposta data Martin Tournoij 22.02.2015 - 20:04
3

Ho scritto un esempio in Python:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])
    
risposta data Mona Jalal 21.10.2016 - 21:57
3

Controllo oneliner della shell (utile per il provisioning)

Ho scoperto che, al fine di rendere il mio provisioning dell'infrastruttura ** idempotente, devo essere in grado di controllare un pacchetto dalla shell in un oneliner. Ho costruito la risposta di @ cuonglm. Ho dovuto invertire 1 e 0 perché sto producendo uno stato di uscita anziché stampare una stringa.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo

Potresti sostituire sys.argv[1] con il singolo nome quotato del tuo pacchetto, ma per i miei script di provisioning mi piace la leggibilità di averlo alla fine.

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

** Mi rendo conto che chef , puppet e ansible hanno tutti plugin per la gestione dei pacchetti python, ma tu potresti trovarti in una situazione come me in cui stai utilizzando una versione obsoleta e non vuoi utilizzare plugin deprecati.

    
risposta data Bruno Bronosky 09.03.2017 - 20:25
1

Si può anche usare pydoc modules , che può essere filtrato con grep per trovare un modulo specifico. L'output è visualizzato in formato columned. L'unico svantaggio di questo approccio è che includerà anche i file python nella directory di lavoro corrente. Ciononostante, lo uso spesso la maggior parte del tempo ed è uno degli approcci più citati su questa domanda correlata: link

    
risposta data Sergiy Kolodyazhnyy 06.01.2017 - 12:24

Leggi altre domande sui tag