Znajdź wszystkie zainstalowane pakiety za pomocą easy_install / pip?

400

Czy istnieje sposób na znalezienie wszystkich pakietów Python PyPI, które zostały zainstalowane za pomocą easy_install lub pip? Mam na myśli wykluczenie wszystkiego, co zostało / jest zainstalowane przy pomocy narzędzi dystrybucji (w tym przypadku apt-get na Debianie).

Jürgen A. Erhard
źródło

Odpowiedzi:

381

pip freezewyświetli listę zainstalowanych pakietów i ich wersji. Umożliwia także zapisanie tych pakietów w pliku, który można później wykorzystać do skonfigurowania nowego środowiska.

https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze

TheodorosPloumis
źródło
89
Od wersji 1.3 dodano „listę pip”. Zobacz moją odpowiedź poniżej i dokumenty tutaj: pip-installer.org/en/latest/usage.html#pip-list
keybits
7
wyświetlać i zamrażać dane wyjściowe w różnych formatach (w momencie pisania). Zamrożonego
Tom Saleeba
18
pip freezei pip listwypisz wszystko. Nie wykluczają pakietów, które nie zostały zainstalowane pip.
Eliad,
Uważam też, że jestem pip freezeniezawodny w skryptach, podczas gdy pip listgeneruje nieoczekiwane błędy, gdy jest używany z potokami.
Dale Anderson
2
Nowa (?) pip list -lLub pip list --localnajlepsza odpowiedź, patrz stackoverflow.com/a/43012269/491884 autor: @MJB
jmuc
255

Od wersji 1.3 pip możesz teraz używać pip list

Ma kilka przydatnych opcji, w tym możliwość wyświetlania nieaktualnych pakietów. Oto dokumentacja: https://pip.pypa.io/en/latest/reference/pip_list/

klucze
źródło
3
W Gentoo zawiera wszystkie pakiety, nawet te zainstalowane w inny sposób niż pip. Czy to naprawdę wyklucza moduły inne niż pip zainstalowane w innym systemie, zgodnie z pytaniem?
jlh 14.04.17
Zauważ, że różni się to nieco odpip freeze
sg
1
pip list --userpokazuje tylko pakiety zainstalowane przez użytkownika i wyklucza pakiety ogólnosystemowe.
Jacob Hume
138

Jeśli ktoś się zastanawia, możesz użyć polecenia „pokaż pip”.

pip show [options] <package>

Spowoduje to wyświetlenie katalogu instalacyjnego danego pakietu.

Daniel Sikes
źródło
24

Jeśli Debian zachowuje się jak najnowsze wersje Ubuntu w odniesieniu do pip installdomyślnego celu, jest to całkiem łatwe: instaluje się w nim /usr/local/lib/zamiast /usr/lib( aptdomyślny cel). Sprawdź /ubuntu/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

Jestem użytkownikiem ArchLinux i podczas eksperymentów z pipem spotkałem ten sam problem. Oto jak rozwiązałem to w Arch.

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'

Kluczem jest tutaj /usr/lib/python2.7/site-packages, do którego katalogu instaluje się pip, YMMV. pacman -Qojest jak łuk za pac Kage człowiek sprawdza ager na własność pliku. No packagejest częścią zamian daje gdy pakiet nie jest właścicielem pliku: error: No package owns $FILENAME. Trudne obejście: pytam o to, __init__.pyponieważ pacman -Qojest trochę nieświadomy, jeśli chodzi o katalogi :(

Aby to zrobić dla innych dystrybucji, musisz dowiedzieć się, gdzie pipinstaluje się rzeczy (po prostu sudo pip installcoś), jak zapytać o własność pliku (metoda Debian / Ubuntu dpkg -S) i co to jest zwrot „żadna paczka nie posiada tej ścieżki” (Debian / Ubuntu is no path found matching pattern). Użytkownicy Debiana / Ubuntu, strzeżcie się: dpkg -Szawiodą, jeśli dacie mu link symboliczny. Po prostu rozwiąż najpierw, używając realpath. Lubię to:

find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'

Użytkownicy Fedory mogą spróbować (dzięki @eddygeek):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
Capi Etheriel
źródło
2
+1 Bardzo dziękuję za jednowarstwową Arch, właśnie tego szukałem. Nawiasem mówiąc, ciekawy fakt: moja instalacja Arch jest zlokalizowana w języku włoskim, ale grep poprawnie „grep” „wypisał” wiersze z napisem „Nessun pacchetto” (po włosku „Brak pakietu”), mimo że grepowałem za „Brak pakietu”. Dlaczego?
Nadir Sampaoli,
1
@barraponto @NadirSampaoli grep nic nie robi w moim przypadku. Ponieważ grep próbuje grep w stdout, ale dpkgnapisz błąd do stderr, więc muszę dodać przekierowanie 2>&1. I dla produkcji międzynarodowej dodaj LANG= przed xargs dpkg -s. i sedjest także miłym narzędziem;), aby zachować tylko nazwę pakietu ścieżki. Tak więc kończę na: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/"
David Boho
1
cześć, głosowałem to przez pomyłkę i dopiero zdałem sobie z tego sprawę, a teraz mój głos jest zamknięty. Czy ktoś mógłby głosować, aby zneutralizować mój głos? Dzięki
Jonathan
22

Zacząć od:

$ pip list

Aby wyświetlić listę wszystkich pakietów. Po znalezieniu żądanego pakietu użyj:

$ pip show <package-name>

Spowoduje to wyświetlenie szczegółów dotyczących tego pakietu, w tym jego folderu. Możesz pominąć pierwszą część, jeśli znasz już nazwę pakietu

Kliknij tutaj, aby uzyskać więcej informacji na temat pip show i tutaj aby uzyskać więcej informacji na temat listy pip.

Przykład:

$ 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    
ng10
źródło
Najlepsza odpowiedź IMHO. Naprawdę proste i szybkie, jeśli znam nazwę pakietu. lista pip nie jest nawet konieczna, a zamrażanie może zająć dużo czasu i muszę odfiltrować rzeczy, na których mi nie zależy. Proste: pokaż pip my_packge
ChuckZ
8

pip.get_installed_distributions() poda listę zainstalowanych pakietów

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
czatować
źródło
2
To już nie zadziała. Zobacz github.com/pypa/pip/issues/5243 Zamiast tego powinieneś użyć: import pkg_resources [print (d.project_name) for d in pkg_resources.working_set]
Almenon
6

Poniżej jest trochę powolny, ale daje dobrze sformatowaną listę pakietów, które pipsą świadome. Oznacza to, że nie wszystkie z nich zostały zainstalowane „przez” pip, ale wszystkie powinny być w stanie zaktualizować za pomocą pip.

$ pip search . | egrep -B1 'INSTALLED|LATEST'

Powodem, dla którego działa powoli, jest to, że wyświetla zawartość całego repozytorium pypi. Złożyłem zgłoszenie sugerujące, aby pip listzapewnić podobną funkcjonalność, ale bardziej efektywnie.

Przykładowe dane wyjściowe: (ograniczyło wyszukiwanie do podzbioru zamiast „.” Dla wszystkich).

$ 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)
$
MarkHu
źródło
Dlaczego nie samemu złożyć biletu?
lajarre
1
Najwyraźniej następna wersja pipa będzie miała nową komendę list: pip-installer.org/en/latest/usage.html#pip-list
MarkHu
5

Dodając do odpowiedzi @Paul Woolcock,

pip freeze > requirements.txt

utworzy plik wymagań ze wszystkimi zainstalowanymi pakietami wraz z zainstalowanymi numerami wersji w aktywnym środowisku w bieżącej lokalizacji. Bieganie

pip install -r requirements.txt

zainstaluje pakiety określone w pliku wymagań.

Wszystko to
źródło
5

Nowsze wersje pipa mają możliwość robienia tego, co OP chce za pomocą pip list -llub pip freeze -l( --list).
Na Debianie (przynajmniej) strona podręcznika nie wyjaśnia tego, a ja to odkryłem - przy założeniu, że funkcja musi istnieć - z pip list --help.

Ostatnie komentarze sugerują, że ta funkcja nie jest oczywista ani w dokumentacji, ani w istniejących odpowiedziach (choć niektórzy o tym sugerują), więc pomyślałem, że powinienem opublikować. Wolałbym to zrobić jako komentarz, ale nie mam punktów reputacji.

MJB
źródło
1
okazuje się, że mieliśmy pip freeze --localprzez 8 lat. pip list --localjest również dostępny ... ale zauważ, że pytanie OP nie dotyczy środowisk wirtualnych (które --localobsługuje), ale rozróżniania pakietów dystrybucyjnych z sudo pip installpakietów.
Capi Etheriel
4

Zauważ, że jeśli masz wiele wersji Pythona zainstalowanych na twoim komputerze, możesz mieć kilka wersji pip związanych z każdą z nich.

W zależności od skojarzeń może być konieczne zachowanie ostrożności podczas używania polecenia pip:

pip3 list 

Pracował dla mnie, gdy uruchamiam Python3.4. Po prostu użycie pip listzwróciło błąd The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip.

ntk4
źródło
pip jest dla python2.7, pip3 jest dla python3.x
mjp
3

Jak wskazał @almenon, to już nie działa i nie jest obsługiwanym sposobem uzyskania informacji o pakiecie w kodzie. Z powyższego wynika wyjątek:

import pip
installed_packages = dict([(package.project_name, package.version) 
                           for package in pip.get_installed_distributions()])

Aby to zrobić, możesz zaimportować pkg_resources. Oto przykład:

import pkg_resources
installed_packages = dict([(package.project_name, package.version)
                           for package in pkg_resources.working_set])

Jestem na v3.6.5

mscheker
źródło
2

Oto jeden linijka dla fedora lub innych dystrybucji rpm (na podstawie wskazówek @barraponto):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'

Dodaj to do poprzedniego polecenia, aby uzyskać czystszy wynik:

 | sed -r 's:.*/(\w+)/__.*:\1:'
eddygeek
źródło
1

Pobierz wszystkie nazwy plików / folderów site-packages/(i dist-packages/jeśli istnieje) i użyj menedżera pakietów, aby usunąć te, które zostały zainstalowane przez pakiet.

Ignacio Vazquez-Abrams
źródło
1

pip freeze wyświetla listę wszystkich zainstalowanych pakietów, nawet jeśli nie przez pip / easy_install. W CentOs / Redhat znajduje się pakiet zainstalowany przez rpm.

użytkownik3013438
źródło
1

Jeśli korzystasz z dystrybucji python Anaconda , możesz użyć conda listpolecenia, aby zobaczyć, co zostało zainstalowane za pomocą jakiej metody:

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

Aby pobrać wpisy zainstalowane przez pip(w tym ewentualnie piprównież):

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>

Oczywiście prawdopodobnie chcesz po prostu wybrać pierwszą kolumnę, którą możesz zrobić (z wyłączeniem, pipjeśli to konieczne):

user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
amqp        
astroid
billiard
blinker
ez-setup
feedgenerator 

Wreszcie możesz pobrać te wartości i odinstalować je wszystkie za pomocą pip:

user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y

Zwróć uwagę na użycie -yflagi, pip uninstallaby uniknąć konieczności potwierdzania usunięcia.

CS
źródło
1

Dla tych, którzy nie mają zainstalowanego pipa, znalazłem ten szybki skrypt na github (działa z Python 2.7.13):

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]
Ed K.
źródło
0

Przynajmniej dla Ubuntu (może także innych) działa to (zainspirowane poprzednim postem w tym wątku):

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
naciśnięcie klawisza
źródło