Как перечислить все установленные пакеты и их версии в Python?

128

Есть ли способ в Python перечислить все установленные пакеты и их версии?

Я знаю, что могу зайти внутрь python/Lib/site-packagesи посмотреть, какие файлы и каталоги существуют, но мне это очень неудобно. То , что я ищу что - то похожее на npm listто есть НПМ-LS .

jsalonen
источник

Ответы:

196

Если у вас есть pip install и вы хотите увидеть, какие пакеты были установлены с помощью ваших инструментов установки, вы можете просто вызвать это:

pip freeze

Он также будет включать номера версий для установленных пакетов.

Обновить

pip был обновлен, чтобы также выдавать тот же результат, что и pip freezeпри вызове:

pip list

Заметка

Выходные данные pip listотформатированы по-другому, поэтому, если у вас есть сценарий оболочки, который анализирует выходные данные (возможно, для получения номера версии) freezeи вы хотите изменить свой скрипт для вызова list, вам необходимо изменить код синтаксического анализа.

Джефф ЛаФэй
источник
9
ИМХО они должны предоставить pip listпсевдоним pip freeze. Писать интуитивно понятно pip freeze > requirements.txt, но нет pip freeze.
jsalonen
3
WOW: только что заглянул в документацию последней версии pip и похоже, что они добавили pip list: pip-installer.org/en/latest/usage.html#pip-list - так что это на самом деле то, что уже идет!
jsalonen
51

help('modules') должен сделать это за вас.

в IPython:

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
Ашвини Чаудхари
источник
5
Это удобно! Хотя я бы тоже хотел увидеть версии.
jsalonen
4
Я думаю, проблема в том, что нет стандартизованного способа включения версии ... иногда это Package.version()или package.__version__или package.verили любое количество других возможностей
Джоран Бизли
Я думал, что девизом питона было «есть только один способ сделать это»;)?
Эд Рэндалл,
3
@EdRandall, нет - это «один очевидный способ сделать это». Всегда есть неочевидный путь. Кроме того, точная формулировка такова: должен быть один - а желательно только один - очевидный способ сделать это. Хотя сначала этот способ может быть не очевиден, если вы не голландец.
rosuav
30

Если вы хотите получить информацию об установленных вами дистрибутивах Python и не хотите использовать для этого консоль или терминал cmd, а хотите использовать код Python, вы можете использовать следующий код (протестирован с помощью Python 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)Функция-вызов возвращает итератор и из-за для цикла и функции печати элементов , содержащихся в итерируемом распечатываются разделены символами новой строки ( \n). Результат будет (в зависимости от установленных вами дистрибутивов) выглядеть примерно так:

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...
морозный
источник
4
Чтобы расширить комментарий @ exhuma, с пипом 10 вы должны использовать: import pkg_resources [print (d.project_name) for d in pkg_resources.working_set]
Almenon
В каком состоянии pkg_resources? AFAICR это часть setuptools. Нет pip. Можем ли мы смело предположить, что setuptoolsвсегда будет доступно только в зависимости от pip?
exhuma
9

Вы можете попробовать: Желток

Для установки желтка попробуйте:

easy_install yolk

Yolk - это инструмент Python для получения информации об установленных пакетах Python и запроса пакетов, доступных в PyPI (индекс пакетов Python).

Вы можете увидеть, какие пакеты активны, неактивны или находятся в режиме разработки, и показать вам, какие доступны более новые версии, запросив PyPI.

llazzaro
источник
На данном этапе я обычно использую pip для этой задачи, но у меня есть очень старый проект, в который я не готов добавить распространение, и я вспомнил, что есть такой инструмент. Не мог вспомнить, как это называлось ... Вот оно!
meshantz
1
Он не поддерживает Python 3 (только что установлен из pip и получил ошибки выполнения)
Охад Коэн
9

Чтобы запустить это в более поздних версиях pip (протестированных pip==10.0.1), используйте следующее:

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)
exhuma
источник
Какой статус внутренний ?. Я вижу, pydoc pip._internalно не могу достучаться до него help(pip._internal), pip .__ builtins_ и т. Д. Справочное руководство по pip также пусто.
MortenB
1
К сожалению, не знаю. Мне тоже не нравится, когда его называют _internal. Похоже, функциональность официально не раскрывается. Так что обращайтесь с этим осторожно!
exhuma
8

из командной строки

python -c help('modules')

можно использовать для просмотра всех модулей и для определенных модулей

python -c help('os')

Для Linux ниже будет работать

python -c "help('os')"
Npradhan
источник
5
Это работает с окнами. В Linux выдает ошибку:-bash: syntax error near unexpected token `('
AjayKumarBasuthkar
это не дает версии модулей
Степан Яковенко
5

да! вы должны использовать pip в качестве диспетчера пакетов Python ( http://pypi.python.org/pypi/pip )

с установленными пакетами pip вы можете сделать

pip freeze

и он перечислит все установленные пакеты. Вероятно, вам также следует использовать virtualenv и virtualenvwrapper . Когда вы начинаете новый проект, вы можете делать

mkvirtualenv my_new_project

а затем (внутри этого virtualenv) выполните

pip install all_your_stuff

Таким образом, вы можете, workon my_new_projectа затемpip freeze , чтобы увидеть , какие пакеты установлены для этого virtualenv / проекта.

например:

  ~  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)➜  ~  

или если у вас есть пакет python с файлом requirements.pip,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

сделает трюк

Andbdrew
источник
Ах да, я уже некоторое время использую virtualenv. Я просто не знаю, как я не понял, что могу использовать pipвместе с ним таким образом!
jsalonen
О virtualenvпакетах глобального сайта, которые вам нужно будет использовать pip list --local.
Иоаннис Филиппидис
@johntex, вы никогда не должны использовать глобальные пакеты сайта!
Andbdrew
Использование пакетов глобального сайта очень полезно. Если бы это было не так, то в virtualenv. Я не знаю ни одной причины, по которой я их не использую, и никто не мешает вам ограничиться изоляцией, virtualenvесли вы предпочитаете.
Иоаннис Филиппидис
Одна из веских причин не использовать их - это то, что когда вы распространяете или развертываете свое приложение или программу, у других людей / серверов не будет пакетов вашего глобального сайта. Если вы единственный, кто пользуется приложением, делайте все, что хотите.
Andbdrew
5

Мое мнение:

#!/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
источник
2

Вот способ сделать это, используя PYTHONPATHвместо абсолютного пути к вашему каталогу python libs:

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
....
Чаун
источник
1

Если это необходимо для запуска из Python, вы можете просто вызвать подпроцесс

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
источник