¿Cómo verificar si un módulo o paquete ya está instalado en python3?

10

Es necesario verificar si está instalado o no antes de que el programa pueda ejecutarse.

hubatrix
fuente
2
Solo ejecuta el pip install. Si ya está instalado, no lo volverá a instalar.
jordanm
Gracias Jordan, pero necesito verificar y dar ao / p y luego probar.
hubatrix

Respuestas:

3

Llene en el shell: pydoc modules.
Esto mostrará una lista de los módulos y puede seleccionar el módulo que desee.
Encontrado en stackoverflow aquí

mazs
fuente
11

Debe usar pipel listcomando con grep, que solo enumera los paquetes instalados (no todos los módulos y sus vecinos también):

pip list | grep -F package_name

Si package_name coincide con varios paquetes instalados, por ejemplo, buscar botocuándo botocoretambién está instalado, usar en -wlugar de -Fpuede ayudar, como sugiere @TaraPrasadGurung. Esto no enumera el paquete exacto, ya que -wve los caracteres comunes en los nombres de paquetes como límites de palabras. Entonces, si tiene requestse requests-cacheinstaló o ruamel.yamly ruamel.yaml.cmd` y necesita exactamente una línea de salida , debe hacer algo como:

pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "

Tenga en cuenta que, dado que .coincide con cualquier carácter al usarlo -E, debe escapar de él.


¹ Y sí, eso es necesario ya que hay un paquete ruamel_yaml. No todos los gestores de paquetes son pipcompatibles cuando se trata de paquetes de espacios de nombres.

Anthon
fuente
El problema con esto es que si el nombre del paquete boto y botocore están instalados, los enumerará a ambos. Entonces, la mejor solución será usar -w flag en lugar de -F para enumerar el paquete exacto
Tara Prasad Gurung
@TaraPrasadGurung Aunque eso puede ayudar a reducir un poco la salida, no ayuda a obtener el paquete exacto como usted afirma. Por ejemplo, el punto y el guión se toman -wcomo límites de palabras y son comunes en los nombres de paquetes. Recibo múltiples coincidencias cuando uso su sugerencia usando grep -w ruamel.yamlogrep -w request
Anthon
pip list | grep -F mxnet-cu101imprime mxnet-cu101 1.5.0, pero no exactamente dónde está instalado. alguna idea de cómo obtener la ruta instalada? `
Anu
@any Sí, tengo una buena idea sobre cómo recuperar dónde está instalado un paquete de Python dado que sé su nombre. Debería publicar una pregunta en este sitio y llamarme aquí para llamar mi atención cuando lo haga, ya que no sigo las preguntas recientemente publicadas en U&L.
Anthon
4

Si el paquete no hace algo loco o consume mucho tiempo en la importación, puede intentar importarlo:

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

He encontrado respuestas existentes incompletas y que carecen de ejemplos suficientemente buenos. Aquí está la solución que he decidido:

# 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

Puede encontrar una idea general de Github de este ejemplo aquí: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6

ShayPal5
fuente
esto se parece mucho a una respuesta existente
Jeff Schaller
1
El código bash es similar, el código Python es diferente, lo que hace una gran diferencia. He leído todas las respuestas existentes antes de elegir agregar las mías, y la respuesta específica a la que se vinculó no funcionó para mí. Por lo tanto, me parece relevante y valioso agregar mi respuesta aquí. :)
ShayPal5
1

También puede usar algo como esto en sus scripts.

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

Lo que obtendría cuando un paquete no está instalado.

Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1

Lo que obtendría cuando se instala un paquete.

Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0

Funciona en python2 y python3, y luego se instala según el código de salida.

RJ
fuente
0

Usé una versión un poco más estricta de la respuesta de Anthon, para usar en un script:

pip3 list |
    grep -v "^Package *Version$" | grep -v "^-*$" |
    cut -d ' ' -f 1 |
    grep -xF "$package_name"

Los primeros dos greps están destinados a quitar las líneas de encabezado de la salida de pip3.

El corte luego selecciona solo los nombres de los paquetes (descartando los números de versión).

Luego, el grep final puede realizar una búsqueda exacta del $package_name

Si se encuentra el paquete, mostrará el nombre del paquete y regresará con el código de salida 0. Si no desea ver el nombre del paquete, finalice el comando con >/dev/null

joeytwiddle
fuente
0

en un shell / prompt de Python. :

>>> help('modules')
El método científico
fuente
0

Probado con pip3:

$> pip3 show MODULENAME

El código de salida ($?) Sería "0" en caso de que el módulo esté instalado, de lo contrario, "1".

Grepping tiene el problema de los "falsos positivos": la salida de un

pip list | grep NAME

coincidiría en cualquier módulo cuyo nombre contenga "NAME", por ejemplo, también coincida con "some_other_NAME".

Mientras

pip3 show MODULENAME

solo partidos en partidos completos.

Thomas Hofmann
fuente