Як перелічити всі встановлені пакети та їх версії в Python?


128

Чи існує спосіб у Python перелічити всі встановлені пакети та їх версії?

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


Відповіді:


196

Якщо у вас встановлена ​​програма pip та ви хочете побачити, які пакунки встановлені за допомогою інструментів інсталятора, ви можете просто зателефонувати цьому:

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
Я думаю , що проблема не стандартизовані Theres спосіб включаючи версію ... іноді його Package.version()або package.__version__або package.verабо будь-яку кількість інших можливостей
Joran Бізлі

Я подумав, що девіз пітона "є лише один спосіб зробити це";)?
Ед Рендалл

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, з pip 10 слід скористатися: імпортувати pkg_resources [print (d.project_name) для d в pkg_resources.working_set]
Альменон,

Який стан pkg_resources? AFAICR, це частина setuptools. Ні pip. Чи можемо ми з упевненістю припустити, що setuptoolsehen завжди буде доступний лише залежно від pip?
ексгума

9

Можна спробувати: жовток

Щоб встановити жовток, спробуйте:

easy_install yolk

Yolk - це інструмент Python для отримання інформації про встановлені пакети Python та пакети запитів, доступні на PyPI (Python Package Index).

Ви можете бачити, які пакети є активними, неактивними або в режимі розробки, і показувати, які нові версії доступні, запитуючи PyPI.


Я зазвичай використовую піп для цього завдання в цей момент, але у мене дуже старий проект, який я не готовий додавати в дистрибутив, і я пам’ятав, що там є такий інструмент. Не міг згадати, як це називали ... Це все було!
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)

Який статус внутрішній ?. Я бачу, pydoc pip._internalале я не можу досягти цього під help(pip._internal), pip .__ buildins_ etc. Посібник для pip також пустий.
MortenB

1
На жаль, я не знаю. Мені не подобається, що мене також називають _internal. Здається, функціональність офіційно не піддається. Тож вам слід обережно поводитися з цим!
ексгума

8

з командного рядка

python -c help('modules')

може використовуватися для перегляду всіх модулів та для конкретних модулів

python -c help('os')

Для Linux нижче буде працювати

python -c "help('os')"

5
Це працює на windows. На Linux він -bash: syntax error near unexpected token `('
видає

це не дає модульних версій
Степан Яковенко,

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 з файлом Requires.pip,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

зробить трюк


О так, я вже деякий час використовую virtualenv. Я просто не знаю, як я не зрозумів, що можу використовувати pipразом із цим таким чином!
jsalonen

Про virtualenvглобальні пакети веб-сайтів вам потрібно використовувати pip list --local.
Іоанніс Філіппідіс

@johntex ніколи не слід використовувати глобальні пакети сайтів!
Andbdrew

Використання глобальних пакетів сайтів дуже корисно. Якби не він, опція взагалі не існувала б virtualenv. Мені невідомі будь-які причини їх використання, і ніхто не заважає вам обмежуватись ізольованими, virtualenvякщо хочете.
Іоанніс Філіппідіс

Однією з важливих причин не використовувати їх є те, що під час розповсюдження чи розгортання програми чи програми інші люди / сервери не матимуть ваших глобальних пакетів сайтів. Якщо ви єдина людина, яка користується додатком, тоді робіть все, що завгодно.
Andbdrew


2

Ось спосіб це зробити, використовуючи PYTHONPATHзамість абсолютного шляху вашого python libs dir:

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"))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.