Existe-t-il un moyen de trouver tous les Python PyPI installés avec easy_install ou pip? Je veux dire, excluant tout ce qui était/est installé avec les outils de distribution (dans ce cas, apt-get sur Debian).
pip freeze
affichera une liste des packages installés et de leurs versions. Il vous permet également d'écrire ces packages dans un fichier qui pourra ensuite être utilisé pour configurer un nouvel environnement.
https://pip.pypa.io/fr/stable/reference/pip_freeze/#pip-freeze
À partir de la version 1.3 de pip, vous pouvez maintenant utiliser pip list
Il propose des options utiles, notamment la possibilité d'afficher des packages obsolètes. Voici la documentation: https://pip.pypa.io/en/latest/reference/pip_list/
Si quelqu'un se demande, vous pouvez utiliser la commande "pip show".
pip show [options] <package>
Ceci listera le répertoire d'installation du paquet donné.
Si Debian se comporte comme les versions récentes d'Ubuntu en ce qui concerne la cible pip install
par défaut, c'est très simple: elle s'installe sur /usr/local/lib/
au lieu de /usr/lib
(apt
cible par défaut). Vérifiez https://askubuntu.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747
Je suis un utilisateur d’ArchLinux et lors de mes expériences avec pip, j’ai rencontré le 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 dans lequel pip installe, YMMV. pacman -Qo
est comment l'arch pac kage man vérifie propriété du fichier. No package
fait partie du retour qu'il donne lorsqu'aucun package ne possède le fichier: error: No package owns $FILENAME
. Solution de contournement difficile: je pose une question sur __init__.py
parce que pacman -Qo
est un peu ignorant en ce qui concerne les répertoires :(
Pour pouvoir le faire pour d'autres distributions, vous devez savoir où pip
installe des choses (juste Sudo pip install
quelque chose), comment interroger la propriété d'un fichier (la méthode Debian/Ubuntu est dpkg -S
) et quel est le retour "aucun paquet ne possède ce chemin" (Debian/Ubuntu est no path found matching pattern
). Utilisateurs de Debian/Ubuntu, méfiez-vous: dpkg -S
échouera si vous lui attribuez un lien symbolique. Il suffit de le résoudre 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'
Commencer avec:
$ pip list
Pour lister tous les paquets. Une fois que vous avez trouvé le paquet que vous voulez, utilisez:
$ pip show <package-name>
Cela vous montrera des détails sur ce paquet, y compris son dossier. Vous pouvez ignorer la première partie si vous connaissez déjà le nom du paquet.
Cliquez ici pour plus d'informations sur le spectacle de pip et ici pour plus d'informations sur la liste de 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: [email protected]
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel
Le texte ci-dessous est un peu lent, mais il donne une liste joliment formatée de paquets que pip
est au courant. C'est-à-dire que tous n'ont pas été installés "par" pip, mais qu'ils devraient tous 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 rapport Pypi. J'ai déposé un ticket suggérant 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)
$
pip.get_installed_distributions()
donnera une liste des paquets 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
Notez que si vous avez plusieurs versions de Python installées sur votre ordinateur, vous pouvez avoir quelques versions de pip associées à chacune d'elles.
Selon vos associations, vous devrez peut-être faire très attention à la commande pip que vous utilisez:
pip3 list
Travaillé pour moi, où je cours Python3.4. Le simple fait d'utiliser pip list
a renvoyé l'erreur The program 'pip' is currently not installed. You can install it by typing: Sudo apt-get install python-pip
.
Les versions les plus récentes de pip ont la capacité de faire ce que l’opérateur veut via liste de pip -l ou pip freeze -l. Sur Debian (au moins), la page de manuel n’explique pas cela clairement et je l’ai découverte - en supposant que la fonctionnalité doit exister - avec liste de pépins --help.
Des commentaires récents suggèrent que cette fonctionnalité n'est pas évidente dans la documentation ou dans les réponses existantes (bien que certains l'aient suggéré), alors j'ai pensé que je devrais poster. J'aurais préféré le faire comme commentaire, mais je n'ai pas les points de réputation.
Ajoutant à la réponse de @Paul Woolcock,
$ pip freeze > requirements.txt
créera un fichier de configuration avec tous les packages installés dans l'environnement actif à l'emplacement actuel que vous pouvez exécuter.
$ pip install -r requirements.txt
installer les exigences dans un autre environnement.
Voici le one-liner pour Fedora ou d'autres distributions rpm (basé sur les astuces @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:'
Comme @almenon l'a fait remarquer, cela ne fonctionne plus et ce n'est pas la méthode prise en charge pour obtenir des informations sur les packages dans votre code. Les éléments suivants soulèvent 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 sur v3.6.5
pip freeze liste tous les paquets installés même si ce n’est pas pip/easy_install. Sur CentOs/Redhat, un paquet installé via rpm est trouvé.
Si vous utilisez la distribution Anaconda python, vous pouvez utiliser la commande conda list
pour voir ce qui a été installé avec 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 juste sélectionner la première colonne, ce que vous pouvez faire avec (en excluant 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 tout désinstaller à l’aide des éléments suivants:
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y
Notez l'utilisation de l'indicateur -y
pour le pip uninstall
afin d'éviter de devoir donner une confirmation de suppression.
Obtenez tous les noms de fichiers/dossiers dans site-packages/
(et dist-packages/
s'il existe), et utilisez votre gestionnaire de paquets pour supprimer ceux qui ont été installés via le paquet.
Pour ceux qui n'ont pas installé pip, j'ai trouvé ce script rapide sur github (fonctionne avec Python 2.7.13):
import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
print distros[key]
Au moins pour Ubuntu (peut-être aussi d'autres), cela fonctionne (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