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


89

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?

Risposte:


73

Come sapere se un modulo Python è installato o meno nel sistema: puoi fare 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 installarescipy 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-pipcome suggerito da Zack Titan nel commento qui sotto , per installare numpypuoi usare

pip install numpy

Avvertenza: si consiglia vivamente di installare i moduli python utilizzando solo il repository ufficiale di Ubuntu e di non utilizzare il pipmetodo come superutente (ovvero, come rooto utilizzando sudo). In alcuni casi potrebbe rendere il sistema inutilizzabile rompendo il sistema Python.

Come installare i pacchetti usando pipnell'ambiente virtuale locale.


Come nella tua risposta, esiste un modulo matematico e per numby il traceback non è apparso e per echo $? l'output era 0, significa che numpy è presente anche nel mio sistema?
TechJhola,

1
sì, è lì nel tuo sistema.
souravc,

Nel caso in cui non abbiate il modulo intorpidito come lo importerete? Quando eseguiamo la codifica, chiamiamo l'istruzione import da numpy import *, installerà il modulo? In caso contrario, come installeremo un nuovo modulo?
TechJhola,

1
Sarà una domanda separata su come installare un modulo. Hai bisogno di pacchetti diversi per modulo diverso. Ad esempio per l'installazione vpythonè necessario installarlo comesudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc il

1
non usare sudo pip; potrebbe rompere il pitone di sistema. Usa apt-get per installare i pacchetti per system python. Puoi usare pip --useroption o virtualenv per installare i pacchetti Python per te stesso.
jfs,

21

Nel caso in cui non desideriamo importare involontariamente un modulo in questione (cosa che succederebbe in una trydichiarazione), possiamo fare uso sys.modulesper testare i moduli che sono stati installati e che sono stati importati in precedenza.

Nel problema della shell python:

>>> import sys

Quindi testare i moduli installati:

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

Si noti che solo quei moduli che sono stati importati prima danno Truesu questo test, tutti gli altri moduli (anche se installati) risultanoFalse.

Un'altra alternativa per tryuna importdichiarazione nella console Python chiama la integrato help()funzioni. 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 aiuto 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 pesantemente dipendente da Python. Per il modulo in questione questo sarebbe ad esempio:

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

Dopo l'installazione, possiamo quindi aggiungerli al sys.modulesdizionario importandoli una volta.


1
Penso che questa sia la risposta più pitonica ....
Grijesh Chauhan,

3
La prima parte è sbagliata: sys.modulescontiene solo moduli che sono già stati importati , quindi non è un modo affidabile per verificare se un modulo è stato installato. Il test più affidabile è usare a try/excepte intrappolare il ImportError, come molti altri hanno già suggerito.
ekhumoro,

@ekhumoro - grazie, modificherò la mia risposta per renderlo più chiaro.
Takkat,

4
Non sembra ancora sufficientemente chiaro. Dato che la domanda è come scoprire se un modulo è installato (non importato ), sys.modulesè del tutto irrilevante e penso che qualsiasi menzione di esso sia fuorviante. Ma forse sono solo io.
David Z,

1
sys.modulesnon è di alcun aiuto qui.
cat

19

Un altro modo è il pkgutilmodulo. Funziona con Python 2 e 3:

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

È necessario sostituire modulecon il nome del modulo, ad esempio:

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

2
Ti ho visto annullare alcuni dei miei cambiamenti; print()funzionerà bene anche in Python 2; È trattato come una sintassi del gruppo con i genitori e non ha effetti collaterali. Solo quando vuoi aggiungere più elementi (poiché in print('a', 'b')esso verranno trattati come tuple, in cui hai bisogno di from __future__ import print_function, ma non è applicabile in questo caso, puoi semplicemente scrivere un codice compatibile con il futuro aggiungendo le parentesi (ho testato le mie modifiche in Python 2 e 3.)
Martin Tournoij,

@Carpetsmoker: Grazie per averci segnalato. Eseguo il rollback alla versione precedente.
cuonglm

Questa è un'ottima risposta Ho aggiunto una risposta derivata che restituisce un codice di uscita / stato (per il controllo del flusso di script della shell) e accetta il nome del modulo come argomento della riga di comando. askubuntu.com/a/891384/146273
Bruno Bronosky il

Ha funzionato! - Basta cambiarlo in exitmodo che possa essere usato nel contesto della shell:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT

12

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

Quindi per vedere quali moduli di terze parti sono disponibili, basta eseguire:

pip freeze

O anche

pip list

Ed entrambi ti mostreranno tutti i moduli installati e le loro versioni.

Se il modulo che stai cercando non è installato, il più delle volte puoi installarlo facilmente con pip:

pip install <module-name>

Se non sei sicuro dell'esistenza di un modulo o del suo nome PyPI, usa pip search:

pip search <keyword>

1
Inoltre, pip show <module-name>mostrerà se è installato un pacchetto, ad es pip show numpy.
Herpes Free Engineer

10

Potresti inserire il codice all'interno try, exceptbloccare.

$ 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

6

Per fornire un'altra risposta, per amor di completamento:

È possibile (ab) utilizzare l' -mopzione. Dalla manpage 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 i moduli inesistenti, ci darà:

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

Potremmo usare grepper abbinare per 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 è leggermente hack-ish, e non quello a cui -mera destinato; ma è il metodo che richiede la minima digitazione se si desidera un test rapido :-)


4
grep -qrende il reindirizzamento su null non necessario.
Muru,

3
@muru Yikes! Nel /dev/nullcorso degli anni ho digitato molti reindirizzamenti inutili : - /
Martin Tournoij,

4

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'])

3

Controllo della shell oneliner (utile per il provisioning)

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

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

È possibile sostituire il sys.argv[1]con il singolo nome tra virgolette del 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 , burattino e ansible hanno tutti plugin per la gestione di pacchetti python, ma potresti trovarti in una situazione come me in cui stai usando una versione obsoleta e non vuoi usare plugin deprecati.


1

Si può anche usare pydoc modules, che può essere filtrato con grepper trovare un modulo specifico. L'output viene visualizzato in formato colonna. L'unico svantaggio di questo approccio è che includerà anche i file Python nella directory di lavoro corrente. Tuttavia, lo uso da solo la maggior parte del tempo ed è uno degli approcci più citati su questa domanda correlata: https://stackoverflow.com/q/739993/3701431


0

Da Ubuntu Shell, per impostazione predefinita bash, semplice come

pip list | grep <package-name-Case-Matters>

Esempi

pip list | grep pywinrm

pip list | grep numpy

E, se hai dubbi sul caso (anche se penso che tutti i nomi dei pacchetti siano sempre in minuscolo):

pip list | grep [Nn]um[Pp]y  # it works with numpy, Numpy, numPy, and NumPy

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.