Existe-t-il un moyen de trouver tous les packages Python PyPI qui ont été installés avec easy_install ou pip? Je veux dire, à l'exclusion de tout ce qui a été / est installé avec les outils de distribution (dans ce cas, apt-get sur Debian).
Existe-t-il un moyen de trouver tous les packages Python PyPI qui ont été installés avec easy_install ou pip? Je veux dire, à l'exclusion de tout ce qui a été / est installé avec les outils de distribution (dans ce cas, apt-get sur Debian).
Réponses:
pip freeze
affichera une liste des packages installés et leurs versions. Il vous permet également d'écrire ces packages dans un fichier qui peut ensuite être utilisé pour configurer un nouvel environnement.
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
pip freeze
et pip list
listez tout. Ils n'excluent pas les packages qui n'ont pas été installés par pip
.
pip freeze
fiable dans les scripts, alors pip list
qu'il générera des erreurs inattendues lorsqu'il sera utilisé avec des tuyaux.
pip list -l
Ou pip list --local
est la meilleure réponse, voir stackoverflow.com/a/43012269/491884 par @MJB
Depuis la version 1.3 de pip, vous pouvez maintenant utiliser pip list
Il a quelques options utiles, y compris la possibilité d'afficher des packages obsolètes. Voici la documentation: https://pip.pypa.io/en/latest/reference/pip_list/
pip freeze
pip list --user
affiche uniquement les packages installés par l'utilisateur et exclut les packages à l'échelle du système.
Si quelqu'un se demande, vous pouvez utiliser la commande «pip show».
pip show [options] <package>
Cela répertorie le répertoire d'installation du package donné.
Si Debian se comporte comme les versions récentes d'Ubuntu concernant la pip install
cible par défaut, c'est très simple: il s'installe à la /usr/local/lib/
place de /usr/lib
( apt
cible par défaut). Vérifiez /ubuntu/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747
Je suis un utilisateur ArchLinux et comme j'ai expérimenté avec pip, j'ai rencontré ce même problème. Voici comment je l'ai résolu dans Arch.
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'
La clé ici est /usr/lib/python2.7/site-packages
, qui est le répertoire d'installation de pip, YMMV. pacman -Qo
est la façon dont pac kage man ager d' Arch vérifie la propriété du fichier. No package
fait partie du retour , il donne quand aucun paquet est propriétaire du fichier: error: No package owns $FILENAME
. Solution de contournement délicate: je pose des questions __init__.py
parce que je suis pacman -Qo
un peu ignorant en ce qui concerne les répertoires :(
Pour le faire pour d'autres distributions, vous devez savoir où pip
installe les trucs (juste sudo pip install
quelque chose), comment interroger la propriété d'un fichier (la méthode Debian / Ubuntu l'est dpkg -S
) et quel est le retour «aucun paquet ne possède ce chemin» (Debian / Ubuntu est no path found matching pattern
). Utilisateurs Debian / Ubuntu, attention: dpkg -S
échouera si vous lui donnez un lien symbolique. Résolvez-le d'abord en utilisant realpath
. Comme ça:
find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'
Les utilisateurs de Fedora peuvent essayer (merci @eddygeek):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
dpkg
écris l'erreur dans stderr donc je dois ajouter une redirection 2>&1
. Et pour la sortie internationale, ajoutez LANG=
devant xargs dpkg -s
. et sed
c'est aussi un bon outil;) pour ne garder que le nom du paquet du chemin. Je me retrouve donc avec:find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | LANG= xargs dpkg -S 2>&1 | grep 'no path found' | sed "s/.*\/\([^\/]*\)\/__init__\.py.*/\1/"
Commencer avec:
$ pip list
Pour répertorier tous les packages. Une fois que vous avez trouvé le package souhaité, utilisez:
$ pip show <package-name>
Cela vous montrera des détails sur ce package, y compris son dossier. Vous pouvez ignorer la première partie si vous connaissez déjà le nom du package
Cliquez ici pour plus d'informations sur le pip show et ici pour plus d'informations sur la liste des pip.
Exemple:
$ pip show jupyter
Name: jupyter
Version: 1.0.0
Summary: Jupyter metapackage. Install all the Jupyter components in one go.
Home-page: http://jupyter.org
Author: Jupyter Development Team
Author-email: jupyter@googlegroups.org
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel
pip.get_installed_distributions()
donnera une liste des packages installés
import pip
from os.path import join
for package in pip.get_installed_distributions():
print(package.location) # you can exclude packages that's in /usr/XXX
print(join(package.location, package._get_metadata("top_level.txt"))) # root directory of this package
Ce qui suit est un peu lent, mais il donne une liste de packages bien formatés qui pip
sont au courant. C'est-à-dire que tous n'ont pas été installés "par" pip, mais tous devraient pouvoir être mis à niveau par pip.
$ pip search . | egrep -B1 'INSTALLED|LATEST'
La raison pour laquelle il est lent est qu'il répertorie le contenu de l'ensemble du repo pypi. J'ai déposé un ticket suggérant de pip list
fournir des fonctionnalités similaires mais plus efficacement.
Exemple de sortie: (restreint la recherche à un sous-ensemble au lieu de '.' Pour tous.)
$ pip search selenium | egrep -B1 'INSTALLED|LATEST'
selenium - Python bindings for Selenium
INSTALLED: 2.24.0
LATEST: 2.25.0
--
robotframework-selenium2library - Web testing library for Robot Framework
INSTALLED: 1.0.1 (latest)
$
Ajoutant à la réponse de @Paul Woolcock,
pip freeze > requirements.txt
créera un fichier d'exigences avec tous les packages installés ainsi que les numéros de version installés dans l'environnement actif à l'emplacement actuel. Fonctionnement
pip install -r requirements.txt
va installer les packages spécifiés dans le fichier des exigences.
Les nouvelles versions de pip ont la possibilité de faire ce que l'OP veut via pip list -l
ou pip freeze -l
( --list
).
Sur Debian (au moins), la page de manuel ne le dit pas clairement, et je ne l'ai découvert - sous l'hypothèse que la fonctionnalité doit exister - qu'avec pip list --help
.
Il y a des commentaires récents qui suggèrent que cette fonctionnalité n'est pas évidente dans la documentation ou les réponses existantes (bien que suggérées par certains), donc j'ai pensé que je devrais poster. J'aurais préféré le faire en commentaire, mais je n'ai pas les points de réputation.
pip freeze --local
depuis 8 ans. pip list --local
est également disponible ... mais notez que la question OP ne concerne pas les environnements virtuels (qui le --local
supportent) mais le discernement des packages de distribution à partir des sudo pip install
packages.
Notez que si plusieurs versions de Python sont installées sur votre ordinateur, vous pouvez avoir quelques versions de pip associées à chacune.
Selon vos associations, vous devrez peut-être faire très attention à la commande pip que vous utilisez:
pip3 list
A fonctionné pour moi, où j'utilise Python3.4. La simple utilisation a pip list
renvoyé l'erreur The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip
.
Comme l'a souligné @almenon, cela ne fonctionne plus et ce n'est pas le moyen pris en charge pour obtenir des informations sur le package dans votre code. Ce qui suit soulève une exception:
import pip
installed_packages = dict([(package.project_name, package.version)
for package in pip.get_installed_distributions()])
Pour ce faire, vous pouvez importer pkg_resources
. Voici un exemple:
import pkg_resources
installed_packages = dict([(package.project_name, package.version)
for package in pkg_resources.working_set])
Je suis dessus v3.6.5
Voici le one-liner pour fedora ou autres distributions de tours (basé sur les conseils de @barraponto):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
Ajoutez ceci à la commande précédente pour obtenir une sortie plus propre:
| sed -r 's:.*/(\w+)/__.*:\1:'
Récupérez tous les noms de fichiers / dossiers site-packages/
(et dist-packages/
s'ils existent) et utilisez votre gestionnaire de packages pour supprimer ceux qui ont été installés via le package.
pip freeze répertorie tous les packages installés même si ce n'est pas par pip / easy_install. Sur CentOs / Redhat, un package installé via rpm est trouvé.
Si vous utilisez la distribution python Anaconda , vous pouvez utiliser la conda list
commande pour voir ce qui a été installé par quelle méthode:
user@pc:~ $ conda list
# packages in environment at /anaconda3:
#
# Name Version Build Channel
_ipyw_jlab_nb_ext_conf 0.1.0 py36h2fc01ae_0
alabaster 0.7.10 py36h174008c_0
amqp 2.2.2 <pip>
anaconda 5.1.0 py36_2
anaconda-client 1.6.9 py36_0
Pour récupérer les entrées installées par pip
(y compris éventuellement pip
lui - même):
user@pc:~ $ conda list | grep \<pip
amqp 2.2.2 <pip>
astroid 1.6.2 <pip>
billiard 3.5.0.3 <pip>
blinker 1.4 <pip>
ez-setup 0.9 <pip>
feedgenerator 1.9 <pip>
Bien sûr, vous voudrez probablement simplement sélectionner la première colonne, ce que vous pouvez faire (à l'exclusion pip
si nécessaire):
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
amqp
astroid
billiard
blinker
ez-setup
feedgenerator
Enfin, vous pouvez récupérer ces valeurs et pip les désinstaller toutes en utilisant ce qui suit:
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y
Notez l'utilisation du -y
drapeau pour pip uninstall
éviter d'avoir à confirmer la suppression.
liste pip [options] Vous pouvez voir la référence complète ici
Au moins pour Ubuntu (peut - être aussi d' autres) fonctionne ce (inspiré d'un précédent post dans ce fil):
printf "Installed with pip:";
pip list 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo