Comment vérifier si un module ou un package est déjà installé en python3?


10

Vous devez vérifier s'il est installé ou non avant de pouvoir exécuter le programme.


2
Exécutez simplement le fichier pip install. S'il est déjà installé, il ne le réinstallera pas.
jordanm

Merci Jordan, mais je dois vérifier et donner ao / p puis tester.
hubatrix

Réponses:


3

Tapez le shell: pydoc modules.
Cela listera les modules et vous pouvez grep le module que vous voulez.
Trouvé sur stackoverflow ici


11

Vous devez utiliser pipla listcommande de avec grep, qui répertorie uniquement les packages installés (pas tous les modules et leurs voisins également):

pip list | grep -F package_name

Si package_name correspond à plusieurs packages installés, par exemple en recherchant botoquand botocoreest également installé, alors utiliser -wau lieu de -Fpeut aider, comme le suggère @TaraPrasadGurung. Cela ne répertorie pas le package exact, car les -wcaractères communs aux noms de packages sont des limites de mots. Donc, si vous avez requestset requests-cacheinstallé ou ruamel.yamlet ruamel.yaml.cmd` et que vous avez besoin exactement d'une ligne de sortie, vous devez faire quelque chose comme:

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

Veuillez noter que puisque .correspond à n'importe quel caractère lors de son utilisation -E, vous devez y échapper.¹


¹ Et oui c'est nécessaire car il y a un package ruamel_yaml. Tous les gestionnaires de packages ne sont pas pipcompatibles avec les packages d'espace de noms.


Le problème est que si le nom du package boto et botocore est installé, il les listera tous les deux. La meilleure solution sera donc d'utiliser -w flag au lieu de -F pour lister le package exact
Tara Prasad Gurung

@TaraPrasadGurung Bien que cela puisse aider à réduire quelque peu la sortie, cela n'aide pas à obtenir le package exact comme vous le prétendez. Par exemple, le point et le tiret sont considérés -wcomme des limites de mot et sont courants dans les noms de package. J'obtiens plusieurs correspondances lorsque j'utilise votre suggestion en utilisant grep -w ruamel.yamlougrep -w request
Anthon

pip list | grep -F mxnet-cu101imprime mxnet-cu101 1.5.0, mais pas exactement où il est installé. une idée comment obtenir le chemin installé? `
Anu

@any Oui, j'ai une bonne idée sur la façon de récupérer où un paquet Python est installé étant donné que je connais son nom. Vous devriez poster une question sur ce site et me contacter ici pour mon attention lorsque vous le faites, car je ne suis pas les questions nouvellement postées sur U&L.
Anthon

4

Si le package ne fait pas quelque chose de fou ou de long à l'importation, vous pouvez essayer de l'importer:

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

2

J'ai trouvé les réponses existantes incomplètes et manquant d'exemples assez bons. Voici la solution sur laquelle j'ai opté:

# 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

Un résumé Github de cet exemple peut être trouvé ici: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6


cela ressemble vraiment à une réponse existante
Jeff Schaller

1
Le code bash est similaire, le code Python est différent, ce qui fait toute la différence. J'ai lu toutes les réponses existantes avant de choisir d'ajouter la mienne, et la réponse spécifique à laquelle vous avez lié n'a pas fonctionné pour moi. Ainsi, je trouve pertinent et utile d'ajouter ma réponse ici. :)
ShayPal5

1

Vous pouvez également utiliser quelque chose comme ça dans vos scripts.

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

Ce que vous obtiendriez lorsqu'un package n'est pas installé.

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

Ce que vous obtiendriez lorsqu'un package est installé.

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

Fonctionne en python2 et python3, puis vous installez en fonction du code de sortie.


0

J'ai utilisé une version légèrement plus stricte de la réponse d'Anthon, à utiliser dans un script:

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

Les deux premiers greps sont destinés à supprimer les lignes d'en-tête de la sortie de pip3.

La coupe sélectionne ensuite uniquement les noms de package (en supprimant les numéros de version).

Ensuite, le grep final peut effectuer une recherche exacte pour le $package_name

Si le package est trouvé, il affichera le nom du package et retournera avec le code de sortie 0. Si vous ne voulez pas voir le nom du package, terminez la commande avec >/dev/null



0

Testé avec pip3:

$> pip3 show MODULENAME

Le code de sortie ($?) Serait "0" si le module est installé, sinon "1".

Grepping a le problème des "faux positifs": la sortie d'un

pip list | grep NAME

correspondrait à n'importe quel module dont le nom contient "NAME", par exemple également "some_other_NAME".

Tandis que

pip3 show MODULENAME

correspond uniquement sur les matchs complets.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.