Jak wyświetlić listę wszystkich zainstalowanych pakietów i ich wersji w Pythonie?

Odpowiedzi:

196

Jeśli masz instalację pip i chcesz zobaczyć, jakie pakiety zostały zainstalowane za pomocą narzędzi instalatora, możesz po prostu nazwać to:

pip freeze

Zawiera również numery wersji zainstalowanych pakietów.

Aktualizacja

pip został zaktualizowany, aby również dawał takie same dane wyjściowe, jak pip freezewywołanie:

pip list

Uwaga

Dane wyjściowe z pip listsą sformatowane inaczej, więc jeśli masz skrypt powłoki, który analizuje dane wyjściowe (być może w celu pobrania numeru wersji) freezei chcesz zmienić skrypt do wywołania list, musisz zmienić kod parsowania.

Jeff LaFay
źródło
9
IMHO powinni podać pip listjako alias dla pip freeze. Pisanie jest intuicyjne pip freeze > requirements.txt, ale nie pip freeze.
jsalonen
3
WOW: Właśnie przejrzałem dokumentację najnowszej wersji pip i wygląda na to, że dodali pip list: pip-installer.org/en/latest/usage.html#pip-list - więc to jest coś, co już nadchodzi!
jsalonen,
51

help('modules') powinien zrobić to za Ciebie.

w IPythonie:

In [1]: import                      #import press-TAB
Display all 631 possibilities? (y or n)
ANSI                   audiodev               markupbase
AptUrl                 audioop                markupsafe
ArgImagePlugin         avahi                  marshal
BaseHTTPServer         axi                    math
Bastion                base64                 md5
BdfFontFile            bdb                    mhlib
BmpImagePlugin         binascii               mimetools
BufrStubImagePlugin    binhex                 mimetypes
CDDB                   bisect                 mimify
CDROM                  bonobo                 mmap
CGIHTTPServer          brlapi                 mmkeys
Canvas                 bsddb                  modulefinder
CommandNotFound        butterfly              multifile
ConfigParser           bz2                    multiprocessing
ContainerIO            cPickle                musicbrainz2
Cookie                 cProfile               mutagen
Crypto                 cStringIO              mutex
CurImagePlugin         cairo                  mx
DLFCN                  calendar               netrc
DcxImagePlugin         cdrom                  new
Dialog                 cgi                    nis
DiscID                 cgitb                  nntplib
DistUpgrade            checkbox               ntpath
Ashwini Chaudhary
źródło
5
To przydatne! Chciałbym jednak zobaczyć również wersje.
jsalonen
4
Myślę, że problem polega na tym, że nie ma ustandaryzowanego sposobu włączenia wersji ... czasami jest to Package.version()lub package.__version__lub package.verlub wiele innych możliwości
Joran Beasley
Myślałem, że motto Pythona brzmi "jest tylko jeden sposób, aby to zrobić";)?
Ed Randall,
3
@EdRandall, nie - to „jeden oczywisty sposób na zrobienie tego”. Zawsze jest nieoczywisty sposób. Ponadto dokładne sformułowanie brzmi: Powinien istnieć jeden - a najlepiej tylko jeden - oczywisty sposób na zrobienie tego. Chociaż na początku może to nie być oczywiste, chyba że jesteś Holendrem.
rosuav
30

Jeśli chcesz uzyskać informacje o zainstalowanych dystrybucjach Pythona i nie chcesz używać do tego konsoli cmd lub terminala, ale raczej za pomocą kodu Pythona, możesz użyć następującego kodu (przetestowanego z pythonem 3.4):

import pip #needed to use the pip functions
for i in pip.get_installed_distributions(local_only=True):
    print(i)

pip.get_installed_distributions(local_only=True)Funkcjonalnie połączenia zwraca iterowalny oraz z powodu dla pętli i drukowaniu elementów zawartych w iterowalny drukowane są oddzielone znakami nowej linii ( \n). Wynik będzie wyglądał (w zależności od zainstalowanych dystrybucji) mniej więcej tak:

cycler 0.9.0
decorator 4.0.4
ipykernel 4.1.0
ipython 4.0.0
ipython-genutils 0.1.0
ipywidgets 4.0.3
Jinja2 2.8
jsonschema 2.5.1
jupyter 1.0.0
jupyter-client 4.1.1
#... and so on...
mroźny
źródło
4
Aby rozwinąć komentarz @ exhuma, z pip 10 powinieneś użyć: import pkg_resources [print (d.project_name) for d in pkg_resources.working_set]
Almenon
Jaki jest stan pkg_resources? AFAICR to jest część setuptools. Nie pip. Czy możemy bezpiecznie założyć, że setuptoolszawsze będzie dostępny, a tylko w zależności od pip?
exhuma
9

Możesz spróbować : Żółtko

Aby zainstalować żółtko, spróbuj:

easy_install yolk

Yolk to narzędzie Pythona do uzyskiwania informacji o zainstalowanych pakietach Pythona i wysyłania zapytań do pakietów dostępnych w PyPI (Python Package Index).

Możesz zobaczyć, które pakiety są aktywne, nieaktywne lub w trybie programistycznym i pokazać, które mają nowsze wersje, wysyłając zapytanie do PyPI.

llazzaro
źródło
Zwykle używam pip do tego zadania, ale mam bardzo stary projekt, do którego nie jestem gotowy, aby dodać do niego dystrybucję, i przypomniałem sobie, że było tam takie narzędzie. Nie pamiętałem jednak, jak to się nazywało ... To było to!
meshantz
1
Nie obsługuje Pythona 3 (właśnie został zainstalowany z pip i wystąpiły błędy uruchomieniowe)
Ohad Cohen
9

Aby uruchomić to w nowszych wersjach pip (testowane na pip==10.0.1), użyj następującego:

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)
exhuma
źródło
Jaki jest stan wewnętrzny? Widzę, pydoc pip._internalale nie mogę go dosięgnąć pod help(pip._internal), pip .__ builtins_ itp. Przewodnik dotyczący pip jest również pusty.
MortenB,
1
Niestety nie wiem. Też mi się nie podoba, jak się nazywa _internal. Wygląda na to, że funkcjonalność nie została oficjalnie ujawniona. Dlatego należy obchodzić się z tym ostrożnie!
exhuma
8

z wiersza poleceń

python -c help('modules')

może być używany do przeglądania wszystkich modułów i dla określonych modułów

python -c help('os')

W przypadku Linuksa poniżej będzie działać

python -c "help('os')"
Npradhan
źródło
5
Działa to w systemie Windows. W Linuksie wyrzuca błąd:-bash: syntax error near unexpected token `('
AjayKumarBasuthkar
to nie daje wersji modułów
Stepan Yakovenko
5

tak! powinieneś używać pip jako menedżera pakietów Pythona ( http://pypi.python.org/pypi/pip )

z zainstalowanymi pakietami pip, możesz zrobić plik

pip freeze

i wyświetli listę wszystkich zainstalowanych pakietów. Prawdopodobnie powinieneś także używać virtualenv i virtualenvwrapper . Kiedy zaczynasz nowy projekt, możesz to zrobić

mkvirtualenv my_new_project

a następnie (wewnątrz tego virtualenv) zrób

pip install all_your_stuff

W ten sposób możesz workon my_new_projecti wtedypip freeze sprawdzić, które pakiety są zainstalowane na tym virtualenv / projektu.

na przykład:

  ~  mkvirtualenv yo_dude
New python executable in yo_dude/bin/python
Installing setuptools............done.
Installing pip...............done.
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/get_env_details

(yo_dude)➜  ~  pip install django
Downloading/unpacking django
  Downloading Django-1.4.1.tar.gz (7.7Mb): 7.7Mb downloaded
  Running setup.py egg_info for package django

Installing collected packages: django
  Running setup.py install for django
    changing mode of build/scripts-2.7/django-admin.py from 644 to 755

    changing mode of /Users/aaylward/dev/virtualenvs/yo_dude/bin/django-admin.py to 755
Successfully installed django
Cleaning up...

(yo_dude)➜  ~  pip freeze
Django==1.4.1
wsgiref==0.1.2

(yo_dude)➜  ~  

lub jeśli masz pakiet Pythona z plikiem Requirements.pip,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

da rade

Andbdrew
źródło
O tak, od jakiegoś czasu używam virtualenv. Po prostu nie wiem, jak nie doszedłem do wniosku, że mogę pipz nim korzystać w ten sposób!
jsalonen
Informacje virtualenvo globalnych pakietach witryn, musisz użyć pip list --local.
Ioannis Filippidis
@johntex nigdy nie powinieneś używać globalnych pakietów witryn!
Andbdrew
Korzystanie z globalnych pakietów witryn jest bardzo przydatne. Gdyby tak nie było, opcja w ogóle by nie istniała virtualenv. Nie znam żadnego powodu, aby ich nie używać i nikt nie stoi na przeszkodzie, abyś ograniczył się do izolacji, virtualenvjeśli wolisz.
Ioannis Filippidis
Jednym z ważnych powodów, aby ich nie używać, jest to, że podczas dystrybucji lub wdrażania aplikacji lub programu inne osoby / serwery nie będą miały pakietów Twojej witryny globalnej. Jeśli jesteś jedyną osobą korzystającą z aplikacji, rób, co chcesz.
Andbdrew,
5

Moje podanie:

#!/usr/bin/env python3

import pkg_resources

dists = [str(d).replace(" ","==") for d in pkg_resources.working_set]
for i in dists:
    print(i)
alfredocambera
źródło
2

Oto sposób, aby to zrobić, używając PYTHONPATHzamiast bezwzględnej ścieżki katalogu bibliotek Python:

for d in `echo "${PYTHONPATH}" | tr ':' '\n'`; do ls "${d}"; done

[ 10:43 Jonathan@MacBookPro-2 ~/xCode/Projects/Python for iOS/trunk/Python for iOS/Python for iOS ]$ for d in `echo "$PYTHONPATH" | tr ':' '\n'`; do ls "${d}"; done
libpython2.7.dylib pkgconfig          python2.7
BaseHTTPServer.py      _pyio.pyc              cgitb.pyo              doctest.pyo            htmlentitydefs.pyc     mimetools.pyc          plat-mac               runpy.py               stringold.pyc          traceback.pyo
BaseHTTPServer.pyc     _pyio.pyo              chunk.py               dumbdbm.py             htmlentitydefs.pyo     mimetools.pyo          platform.py            runpy.pyc              stringold.pyo          tty.py
BaseHTTPServer.pyo     _strptime.py           chunk.pyc              dumbdbm.pyc            htmllib.py             mimetypes.py           platform.pyc           runpy.pyo              stringprep.py          tty.pyc
Bastion.py             _strptime.pyc          chunk.pyo              dumbdbm.pyo            htmllib.pyc            mimetypes.pyc          platform.pyo           sched.py               stringprep.pyc         tty.pyo
Bastion.pyc            _strptime.pyo          cmd.py
....
chown
źródło
1

Jeśli jest to potrzebne do uruchomienia z poziomu Pythona, możesz po prostu wywołać podproces

from subprocess import PIPE, Popen

pip_process = Popen(["pip freeze"], stdout=PIPE,
                   stderr=PIPE, shell=True)
stdout, stderr = pip_process.communicate()
print(stdout.decode("utf-8"))
juftin
źródło