Risposte:
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
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-pip
come suggerito da Zack Titan nel commento qui sotto , per installare numpy
puoi 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 pip
metodo come superutente (ovvero, come root
o utilizzando sudo
). In alcuni casi potrebbe rendere il sistema inutilizzabile rompendo il sistema Python.
Come installare i pacchetti usando pip
nell'ambiente virtuale locale.
vpython
è necessario installarlo comesudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
sudo pip
; potrebbe rompere il pitone di sistema. Usa apt-get per installare i pacchetti per system python. Puoi usare pip --user
option o virtualenv per installare i pacchetti Python per te stesso.
Nel caso in cui non desideriamo importare involontariamente un modulo in questione (cosa che succederebbe in una try
dichiarazione), possiamo fare uso sys.modules
per 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 True
su questo test, tutti gli altri moduli (anche se installati) risultanoFalse.
Un'altra alternativa per try
una import
dichiarazione 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.modules
dizionario importandoli una volta.
sys.modules
contiene 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/except
e intrappolare il ImportError
, come molti altri hanno già suggerito.
sys.modules
è del tutto irrilevante e penso che qualsiasi menzione di esso sia fuorviante. Ma forse sono solo io.
sys.modules
non è di alcun aiuto qui.
Un altro modo è il pkgutil
modulo. Funziona con Python 2 e 3:
python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'
È necessario sostituire module
con il nome del modulo, ad esempio:
$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
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.)
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-pip
se 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>
pip show <module-name>
mostrerà se è installato un pacchetto, ad es pip show numpy
.
Potresti inserire il codice all'interno try
, except
bloccare.
$ 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
Per fornire un'altra risposta, per amor di completamento:
È possibile (ab) utilizzare l' -m
opzione. 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 grep
per 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 -m
era destinato; ma è il metodo che richiede la minima digitazione se si desidera un test rapido :-)
grep -q
rende il reindirizzamento su null non necessario.
/dev/null
corso degli anni ho digitato molti reindirizzamenti inutili : - /
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'])
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 1
e 0
perché 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.
Si può anche usare pydoc modules
, che può essere filtrato con grep
per 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
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
Al momento di scrivere questo, pip show ...
sembra essere il modo più semplice:
https://pip.pypa.io/en/stable/reference/pip_show/
Ma è silenzioso (cioè non restituisce nulla) quando il pacchetto non è installato.