Як я можу отримати список локально встановлених модулів Python?


996

Я хотів би отримати список модулів Python, які знаходяться в моїй установці Python (сервер UNIX).

Як можна отримати список модулів Python, встановлених на вашому комп'ютері?


77
ви можете просто зробити >>> help (), а потім >>> модулі
Julius Naeumann

1
Чи є альтернатива? help () висить для мене.
Пауло Карвальо,

2
Багато цих відповідей передбачають, що у вас є доступ до командного рядка. Якщо ви використовуєте AWS Lambda, вам доведеться робити все це зсередини Python. Див stackoverflow.com/a/54939905/117471
Бруно Bronosky

Відповіді:


610

Рішення

Не використовуйте з pip> 10.0!

Мої 50 копійок за отримання pip freezeсписку-подібних зі сценарію Python:

import pip
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages])
print(installed_packages_list)

Як (занадто довгий) один вкладиш:

sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])

Давання:

['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 
 'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 
 'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
 'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 
 'werkzeug==0.9.4']

Область застосування

Це рішення відноситься до області системи або в сферу віртуального середовища, і охоплюють пакети встановлені setuptools, pipі ( бог забороняє ) easy_install.

Мій випадок використання

Я додав результат цього дзвінка на мій сервер колб, тож коли я зателефонував до нього, http://example.com/exampleServer/environmentя отримаю список пакунків, встановлених на virtualenv сервера. Це полегшує налагодження багато чого.

Коваджі

Я помітив дивну поведінку цієї методики - коли інтерпретатор Python викликається в тій самій каталозі, що і setup.pyфайл, він не перераховує встановлений пакетом пакет setup.py.

Кроки до відтворення:

Створіть віртуальне середовище
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $ 
Клоніруйте git repo с setup.py
(test_env) $ git clone https://github.com/behave/behave.git
Cloning into 'behave'...
remote: Reusing existing pack: 4350, done.
remote: Total 4350 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.
Resolving deltas: 100% (2388/2388), done.
Checking connectivity... done.

Ми BEHAVE років setup.pyв /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Встановіть пакет python з git repo
(test_env) $ cd /tmp/behave && pip install . 
running install
...
Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg
Finished processing dependencies for behave==1.2.5a1

Якщо ми запустимо вищезгадане рішення з /tmp

>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp'

Якщо ми запустимо вищезгадане рішення з /tmp/behave

>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp/behave'

behave==1.2.5a1відсутній у другому прикладі, оскільки робоча директорія містить файл behave's setup.py.

Я не зміг знайти жодної посилання на це питання в документації. Можливо, я відкрию для цього помилку.


5
Дякую за цю відповідь! Я думаю, що це краще відповідає на питання, тому що я запитую "локально" встановлені модулі Python. Заморозка піп - це також не завжди шлях. Це працює краще - я думаю.
Лео Леопольд Герц 준영

3
@Masi Просто додав детальне пояснення застереження цього рішення. Це справді дивно.
Адам Матан

21
Альтернатива:import pkg_resources; installed_packages = [(d.project_name, d.version) for d in pkg_resources.working_set]
ebolyen

14
З 10 піп ця відповідь більше не працюватиме. У коментарі @ebolyen показані альтернативні команди, які працюють. Я прийшов до такого ж висновку і розмістив повний переглянений код нижче.
Big_Al_Tx

5
В останніх версіях pip це не працює, повідомляючи про помилку AttributeError: module 'pip' has no attribute 'get_installed_distributions'.
HelloGoodbye

1038
help('modules')

в оболонці / підказці Python.


10
@dF pydoc modulesпрацює. Ви повинні подати це як відповідь.
Абізерн

37
Вини мені провину!
zanbri

3
nobar, zanbri, @Joe Frambach: на Ubuntu? Тут описана помилка: bugs.launchpad.net/ubuntu/+source/python2.7/+bug/896836
ChristopheD

2
як я можу отримати додаткову інформацію про те, де встановлені модулі та яка поточна версія?
цікаво

5
python -c 'help("modules")'
kenorb

285

Тепер ці методи я спробував сам, і я отримав саме те, що було рекламовано: Усі модулі.

На жаль, насправді вам не дуже хвилюється stdlib, ви знаєте, що ви отримуєте з встановленням python.

Дійсно, я хочу те, що я встановив.

Що насправді, на диво, спрацювало чудово:

pip freeze

Що повернулося:

Fabric==0.9.3
apache-libcloud==0.4.0
bzr==2.3b4
distribute==0.6.14
docutils==0.7
greenlet==0.3.1
ipython==0.10.1
iterpipes==0.4
libxml2-python==2.6.21

Я кажу "напрочуд", тому що інструмент для встановлення пакунків - саме те місце, де можна було б знайти цю функціональність, хоча не під назвою "заморозити", але упаковка пітона настільки дивна, що я здивований, що цей інструмент має сенс. Піп 0.8.2, Python 2.7.


4
Я думаю, що ідея за назвою полягає в тому, що ви отримуєте "заморожений" знімок того, що зараз встановлено, який ви можете пізніше повернути в піп, щоб отримати точно такі ж модулі, встановлені в іншому середовищі.
Райан К. Томпсон

На жаль, ви також можете встановити pip і в Windows! Спочатку встановіть setuptools, а потім використовуйте easy_install для установки pip :)
gawbul

Це чудово, але, схоже, пропускають деякі бібліотеки, які я встановив. Наприклад, в ньому не вказано PyQt.
Junuxx

8
Починаючи з pip 1.3 є команда list .
Пьотр Доброгост

це працює. Що таке безладний пітон. Чому вони не можуть зібрати свій вчинок разом і придумати рішення, подібні до того, що існує в Rails? (Gemfile, bundler, rvm)
Димитріс

106

Починаючи з pip версії 1.3, ви отримаєте доступ до:

pip list

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


4
Тут також pip list --localрозрізняють virtualenvі глобальні пакети сайтів, про які йшлося .
Іоанніс Філіппідіс

1
На сьогодні найкращий. Він також отримує версії.
aerijman

pip listє найпростішим і найкращим. Ось варіанти та деталі.
Леві Багулей

86
  • У ipythonви можете ввести « importTab».

  • У стандартному інтерпретаторі Python ви можете набрати " help('modules')".

  • У командному рядку ви можете використовувати .pydoc modules

  • У сценарії дзвоніть pkgutil.iter_modules().


5
pkgutil.iter_modules()працює, розклад піп-файлів вище не містить усіх пакетів, лише встановлені через pip.
метапертура

2
Дивовижно! Я думаю, що вони покращили документацію, оскільки було задано питання. pydoc модулі спам шукає спам у документах модулів. Останній пункт, здається, дає тобі достатню інформацію для використання модуля. @metaperture Ви можете, будь ласка, навести приклад того, як ви перераховуєте всі встановлені локальні модулі (а не масовий список stlib за допомогою help (' module ')) від pkgutil.iter_modules () .
Лео Леопольд Герц 준영

2
@ LéoLéopoldHertz 준영 Спробуйте цей фрагмент коду: python -c 'import pkgutil;print [x[1] for x in list(pkgutil.iter_modules())]'. Він повинен скидати всі назви модулів як один дійсно великий список Python. x[1]Біт використовується зривати ім'я модуля з кортежів , що генеруються pkgutil.iter_modules().
Філіп Конрад

76

Я просто використовую це для перегляду використовуваних модулів:

import sys as s
s.modules.keys()

який показує всі модулі, що працюють на вашому python.

Для всіх вбудованих модулів використовуйте:

s.modules

Який дикт, що містить усі модулі та об’єкти імпорту.


2
# Після імпорту sys "import sys as s" ви можете друкувати за допомогою: print sys.modules.keys ()
Dan Evans

Не впевнений, чому мою публікацію було відредаговано, але дякую, що використовували інформацію, яку я розмістив, щоб виправити помилки в попередніх публікаціях. Ви повернете помилки, якщо будете використовувати help () vs help (''). Це стосується також dir ('') & sys ('') тощо. Сподіваюся, це допомагає & не буде видалено.
Дан Еванс

Ігнорувати мою останню публікацію, ця публікація не редагувалася. Я думав про подібний пост, знайдений тут: stackoverflow.com/questions/139180/… Вибачте за плутанину.
Дан Еванс

7
Оновлений, тому що це єдиний метод, який, здається, працює у обмежених системах, які не мають pydocні pipвстановлених (NAS в моєму випадку).
Томас

1
Домовились з Томасом. Наприклад, я використовую repl.it, який також є обмеженим середовищем. help('modules')просто висить без відповіді для мене. Але цей підхід із sysідеально працює
Сергій Колодяжний

63

У звичайній оболонці просто використовувати

pydoc modules

Здається, що вищезазначене працює лише на 'nix-платформах. У будь-якому випадку, я знайшов і запустив скрипт, адаптувавши команду так: c: \ bin \ pythos_2.7 \ lib \ pydoc.py модулі - цей список зайняв назавжди для складання, формат висмоктується, і він опускає встановлену версію число. Я пройду.
Девід А. Грей

2
@ DavidA.Gray Просто спробував це на машині Windows з Python 3, і це насправді працює. За допомогою запуску windows python ви можете зробити py -m pydoc modulesв cmd або Powershell.
ВКК

pydoc modulesне працював для мене в Windows 10 з Python 3.6, але модифікація @VKK: py -m pydoc modulesпрацює в cmd / Powershell.
Мартін

41

Станом на п. 10, прийнята відповідь більше не працюватиме. Команда розробників видалила доступ до get_installed_distributionsрозпорядку. Існує альтернативна функція у setuptoolsвиконанні того ж самого. Ось альтернативна версія, яка працює з pip 10:

import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages])
print(installed_packages_list)

Будь ласка, дайте мені знати, чи це не спрацює і в попередніх версіях pip.


2
Я шукав це рішення і перекручував мозок, намагаючись розібратися у pkg_resources. Якби я міг би схвалити це не раз, Дякую, @Big_Al_Tx! Оновлення: За винятком .... коли я роблю 'pip freeze' у своєму віртуальному середовищі і порівнюю його з результатом цього, є пакунки, яких немає. Будь-які думки про те, чому це могло / могло статися?
числовон

@numberwhun - Я радий, що це працювало для тебе. Вибачте, але у мене немає відповіді на невідповідність pip freeze; глибина моїх знань з цієї теми досить обмежена. Я начебто зіпсував свій шлях до рішення, коли прийнята відповідь не працювала для мене, і я спробував поєднати її з відповіддю, пов’язаною з цим, setuptoolsі змусив його працювати.
Big_Al_Tx

github.com/pypa/pip/isissue/5243 - Розмова команди розробки про видалений доступ до get_installed_distributions routine.
bl79

@ bl79 - Я думаю, що саме там я отримав довідку setuptools.
Big_Al_Tx

@Big_Al_Tx: Ну, я начебто працював над параметром setuptools (який був заплутаний для моїх потреб), і я пішов з цим: install_pkgs = subprocess.check_output (['pip', 'freeze']) Це робить саме те, що я потрібно було це зробити .... Так !!
числовон

26

Якщо нам потрібно перелічити встановлені пакети в оболонці Python, ми можемо використовувати helpкоманду наступним чином

>>help('modules package')

22

Я зазвичай використовую pip listдля отримання списку пакетів (з версією).

Звичайно, це працює і у віртуальному середовищі. Щоб показати, що встановлено лише у віртуальному середовищі (не у глобальних пакетах), використовуйте pip list --local.

Ось документація, що показує всі доступні pip listваріанти, з кількома хорошими прикладами.


13

Дуже простий пошук, використовуючи pkgutil.iter_modules

from pkgutil import iter_modules
a=iter_modules()
while True:
    try: x=a.next()
    except: break
    if 'searchstr' in x[1]: print x[1]

Чи є якась причина використовувати, а не для циклу? Я писав за допомогою, for m in iter_modules()і це також спрацювало.
Жоао Понте

13

у вікні Введіть це у cmd

c:\python\libs>python -m pip freeze

Для мене це працювало: python3 -m pip freeze - для python 3.5.3.
dpminusa

Це добре працює, і вам не потрібно також бути в каталозі libs, якщо ваші змінні визначені
mcy

12

Я наткнувся на встановлений на ПК python 2.7 на OS X. Це вимагало X11, щоб перелічити встановлені модулі (як за допомогою довідки, так і pydoc).

Щоб мати можливість перелічити всі модулі без установки X11, я запустив pydoc як http-сервер, тобто:

pydoc -p 12345

Тоді можна направити Safari, http://localhost:12345/щоб побачити всі модулі.



12

Це допоможе

У терміналі або IPython введіть:

help('modules')

тоді

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

Це має бути прийнята відповідь! Один рядок :)
МайжеПітт

9

Це рішення є основним на основі модулів importlibі pkgutilпрацює з CPython 3.4 та CPython 3.5, але не підтримує CPython 2.


Пояснення

  1. sys.builtin_module_names- називає всі вбудовані модулі (дивіться мою відповідь тут )
  2. pkgutil.iter_modules() - повертає інформацію про всі доступні модулі
  3. importlib.util.find_spec() - повертає інформацію про модуль імпорту, якщо він існує
  4. BuiltinImporter- імпортер для вбудованих модулів ( документів )
  5. SourceFileLoader- імпортер для стандартного модуля Python (за замовчуванням має розширення * .py) ( документи )
  6. ExtensionFileLoader- імпортер для модулів як спільної бібліотеки (написаний на C або C ++)

Повний код

import sys
import os
import shutil
import pkgutil
import importlib
import collections

if sys.version_info.major == 2:
    raise NotImplementedError('CPython 2 is not supported yet')


def main():

    # name this file (module)
    this_module_name = os.path.basename(__file__).rsplit('.')[0]

    # dict for loaders with their modules
    loaders = collections.OrderedDict()

    # names`s of build-in modules
    for module_name in sys.builtin_module_names:

        # find an information about a module by name
        module = importlib.util.find_spec(module_name)

        # add a key about a loader in the dict, if not exists yet
        if module.loader not in loaders:
            loaders[module.loader] = []

        # add a name and a location about imported module in the dict
        loaders[module.loader].append((module.name, module.origin))

    # all available non-build-in modules
    for module_name in pkgutil.iter_modules():

        # ignore this module
        if this_module_name == module_name[1]:
            continue

        # find an information about a module by name
        module = importlib.util.find_spec(module_name[1])

        # add a key about a loader in the dict, if not exists yet
        loader = type(module.loader)
        if loader not in loaders:
            loaders[loader] = []

        # add a name and a location about imported module in the dict
        loaders[loader].append((module.name, module.origin))

    # pretty print
    line = '-' * shutil.get_terminal_size().columns
    for loader, modules in loaders.items():
        print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader))
        for module in modules:
            print('{0:30} | {1}'.format(module[0], module[1]))


if __name__ == '__main__':
    main()

Використання

Для CPython3.5 (усічений)

$ python3.5 python_modules_info.py 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
30: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast                           | built-in
_codecs                        | built-in
_collections                   | built-in
_functools                     | built-in
_imp                           | None
_io                            | built-in
_locale                        | built-in
_operator                      | built-in
_signal                        | built-in
_sre                           | built-in
_stat                          | built-in
_string                        | built-in
_symtable                      | built-in
_thread                        | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
227: <class '_frozen_importlib_external.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__                     | /usr/local/lib/python3.5/__future__.py
_bootlocale                    | /usr/local/lib/python3.5/_bootlocale.py
_collections_abc               | /usr/local/lib/python3.5/_collections_abc.py
_compat_pickle                 | /usr/local/lib/python3.5/_compat_pickle.py
_compression                   | /usr/local/lib/python3.5/_compression.py
_dummy_thread                  | /usr/local/lib/python3.5/_dummy_thread.py
_markupbase                    | /usr/local/lib/python3.5/_markupbase.py
_osx_support                   | /usr/local/lib/python3.5/_osx_support.py
_pydecimal                     | /usr/local/lib/python3.5/_pydecimal.py
_pyio                          | /usr/local/lib/python3.5/_pyio.py
_sitebuiltins                  | /usr/local/lib/python3.5/_sitebuiltins.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
64: <class '_frozen_importlib_external.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bisect                        | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so
_bz2                           | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so
_codecs_cn                     | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so
_codecs_hk                     | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so
_codecs_iso2022                | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so
(****************************truncated*******************************)

Для CPython3.4 (усічений)

$ python3.4 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
54: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast                           | built-in
_bisect                        | built-in
_codecs                        | built-in
_collections                   | built-in
_datetime                      | built-in
_elementtree                   | built-in
_functools                     | built-in
_heapq                         | built-in
_imp                           | None
_io                            | built-in
_locale                        | built-in
_md5                           | built-in
_operator                      | built-in
_pickle                        | built-in
_posixsubprocess               | built-in
_random                        | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
246: <class '_frozen_importlib.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__                     | /usr/lib/python3.4/__future__.py
_bootlocale                    | /usr/lib/python3.4/_bootlocale.py
_collections_abc               | /usr/lib/python3.4/_collections_abc.py
_compat_pickle                 | /usr/lib/python3.4/_compat_pickle.py
_dummy_thread                  | /usr/lib/python3.4/_dummy_thread.py
_markupbase                    | /usr/lib/python3.4/_markupbase.py
_osx_support                   | /usr/lib/python3.4/_osx_support.py
_pyio                          | /usr/lib/python3.4/_pyio.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
44: <class '_frozen_importlib.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bz2                           | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so
_codecs_cn                     | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so
_codecs_hk                     | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so
_codecs_iso2022                | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so
_codecs_jp                     | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so
_codecs_kr                     | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so
_codecs_tw                     | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so
_crypt                         | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so
(****************************truncated*******************************)

Чи можете ви порівняти свій підхід до підходу Адама тут stackoverflow.com/a/23885252/54964
Лео Леопольд Герц 준영

@ Лео Леопольд Герц, навіщо це потрібно?
ПАДИМКО

Щоб зрозуміти, як ваш підхід кращий / гірший, ніж підхід Адама.
Лео Леопольд Герц 준영

1
@ Лео Леопольд Герц. Коротка відповідь: спробуйте самі у постановці та зробіть висновки самостійно. Довга відповідь: підхід Адама заснований на системі pipуправління пакунками, яка використовується для встановлення та управління програмними пакетами, написаними на Python, і в результаті pip.get_installed_distributions()повертає модулі, встановлені разом з піп. Моя відповідь повністю базується на стандартній бібліотеці Python і охоплює всі модулі, доступні для імпорту. Найбільший недолік моєї відповіді - немає підтримки для CPython 2.
PADYMKO

1
@ Лео Леопольд Герц ви помиляєтесь, це робить. Я перевірив це на своєму комп’ютері. Моя відповідь містить особливе значення **truncated**, де результат врізаний. Можливо, ви не обережні, але якщо це не так, щоб надіслати мені інформацію про вашу систему та реалізацію Python, я проведу додаткові дослідження для її виправлення.
ПАДИМКО

9

Попередження: Адам Матан перешкоджає цьому використанню в pip> 10.0. Також читайте коментар @ sinoroc нижче

Це був натхненний Адама Матан в відповідь (прийнятий один):

import tabulate
try:
  from pip import get_installed_distributions
except:
  from pip._internal.utils.misc import get_installed_distributions

tabpackages = []
for _, package in sorted([('%s %s' % (i.location, i.key), i) for i in get_installed_distributions()]):
  tabpackages.append([package.location, package.key, package.version])

print(tabulate.tabulate(tabpackages))

яка потім виводить таблицю у вигляді

19:33 pi@rpi-v3 [iot-wifi-2] ~/python$ python installed_packages.py
-------------------------------------------  --------------  ------
/home/pi/.local/lib/python2.7/site-packages  enum-compat     0.0.2
/home/pi/.local/lib/python2.7/site-packages  enum34          1.1.6
/home/pi/.local/lib/python2.7/site-packages  pexpect         4.2.1
/home/pi/.local/lib/python2.7/site-packages  ptyprocess      0.5.2
/home/pi/.local/lib/python2.7/site-packages  pygatt          3.2.0
/home/pi/.local/lib/python2.7/site-packages  pyserial        3.4
/usr/local/lib/python2.7/dist-packages       bluepy          1.1.1
/usr/local/lib/python2.7/dist-packages       click           6.7
/usr/local/lib/python2.7/dist-packages       click-datetime  0.2
/usr/local/lib/python2.7/dist-packages       construct       2.8.21
/usr/local/lib/python2.7/dist-packages       pyaudio         0.2.11
/usr/local/lib/python2.7/dist-packages       tabulate        0.8.2
-------------------------------------------  --------------  ------

що дозволяє вам легко визначити, які пакунки встановлені з і без sudo.


Зауваження в сторону: Я помітив, що коли я встановлюю пакет один раз через один раз sudoі один раз, один має перевагу, так що інший не буде вказаний у списку (відображається лише одне місцезнаходження). Я вважаю, що тоді перераховується лише той, який знаходиться в локальному каталозі. Це можна вдосконалити.


1
Ні. Це не рекомендується, дивіться тут: pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program
sinoroc

1
@sinoroc Дякую, що вказали на це. Пункти від 1 до 3 не здаються застосовними до цього рішення, тому що цей скрипт має єдину мету використовувати pipодин раз, а потім вийти з нього. Здається, це більше проблема, яка може змінити поведінку.
Даніель Ф

Погоджено, причини, чому немає публічного API, не стосуються саме цього коду. Але оскільки pip не зобов'язаний гарантувати публічний API, він може змінити свої внутрішні API, структуру коду тощо у більш пізньому випуску, як це було раніше. Ось чому цей код має спробу / за винятком того, щоб зафіксувати попередню внутрішню реорганізацію коду, яка мала на меті уточнити, що внутрішні API - це внутрішні API, а не загальнодоступні ( _internal). Загалом, це, очевидно, працює, але це погана практика. Є кращі альтернативи, деякі - в інших відповіді на це питання.
sinoroc

1
цей сценарій не буде працювати, якщо модуля "pip" немає.
Олександр Стор


6

Якщо у вас встановлено розподілення анаконди пітона , ви також можете використовувати

$conda list

крім описаних вище розчинів.


Де / як ви ведете цю лінію?
HuckIt

Якщо ви перебуваєте на вашій машині UNIX / Mac OS X, відкрийте свій термінал і просто введіть conda install, він повинен працювати :)
Shreyas

Я на машині Windows 7. Я знайшов це на своєму шляху, але conda.exe є в AppData \ Local \ Continuum \ Anaconda \ Scripts.
HuckIt

6
  1. щоб отримати всі доступні модулі, запустіть sys.modules
  2. щоб отримати всі встановлені модулі (читати: встановлено pip), ви можете подивитисяpip.get_installed_distributions()

Для другого призначення, приклад коду:

import pip
for package in pip.get_installed_distributions():
    name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib
    key = package.key # sqlalchemy, django, flask-oauthlib
    module_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthlib
    location = package.location # virtualenv lib directory etc.
    version = package.version # version number

Команда sys.modules не працює в новітньому Pyxhon OSX. NameError: ім'я 'system' не визначено .
Лео Леопольд Герц 준영

@Masi Ви мали на увазі /usr/bin/pythonчи той, хто походить з python.org ? Для колишнього я можу користуватися sys.modulesбез проблем.
yegle

Я маю на увазі / usr / bin / python .
Лео Леопольд Герц 준영

@Masi Не впевнений, чи все ж ти зацікавився цією проблемою. Мабуть, ви використовуєте system.modulesзамість цього sys.modules.
yegle

Лол. Моя помилка полягала в тому, що я спочатку не імпортував sys -package. Так працює замість імпорту sys; sys.modules працюють як слід.
Лео Леопольд Герц 준영

6

Для останніх версій, таких як Pip 20

Виконайте наступне у своєму редакторі python або IPython

import pkg_resources; 
installed_packages = {d.project_name: d.version for d in pkg_resources.working_set}
print(installed_packages)

Прочитайте інші відповіді та зібравши це комбо, яке найшвидше і простіше всередині Python


4

pip freeze робить все це для пошуку пакетів, проте можна просто написати наступну команду, щоб перелічити всі шляхи, де є пакети python.

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

4

Існує багато способів шкіряти кота.

  • Найпростіший спосіб - використовувати pydocфункцію безпосередньо з оболонки за допомогою:
    pydoc modules

  • Але для отримання додаткової інформації використовуйте інструмент під назвою pip-date, який також повідомляє дати встановлення.
    pip install pip-date


введіть тут опис зображення


3

Є багато ідей, спочатку я розмірковую над цими двома:

піп

мінуси: не завжди встановлюється

help ("модулі")

мінуси: вихід на консоль; зі зламаними модулями (див. ubuntu ...) може бути за замовчуванням

Мені потрібен простий підхід, використовуючи базові бібліотеки та сумісні зі старим python 2.x

І я бачу світло: listmodules.py

Прихований у каталозі джерел документації в 2.5 - невеликий скрипт, в якому перераховані всі доступні модулі для установки Python.

Плюси:

використовує лише imp, sys, os, re, time

розроблений для роботи на Python 1.5.2 та новіших версій

вихідний код дійсно компактний, тому ви можете легко повозитися з ним, наприклад, передати список виключень баггі-модулів (не намагайтеся імпортувати їх)


3

Мені потрібно було знайти конкретну версію пакетів, доступних за замовчуванням в AWS Lambda. Я зробив це з розшаруванням ідей з цієї сторінки. Я ділюсь цим для нащадків.

import pkgutil

__version__ = '0.1.1'

def get_ver(name):
    try:
        return str(__import__(name).__version__)
    except:
        return None

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': [{
                   'path': m.module_finder.path,
                   'name': m.name,
                   'version': get_ver(m.name),
                 } for m in list(pkgutil.iter_modules())
                 #if m.module_finder.path == "/var/runtime" # Uncomment this if you only care about a certain path
                ],
    }

Що я виявив, що надана бібліотека boto3 застаріла, і я не винен, що мій код вийшов з ладу. Мені просто потрібно було додати boto3 та botocore до свого проекту. Але без цього я б бив головою, думаючи, що мій код поганий.

{
  "statusCode": 200,
  "body": [
    {
      "path": "/var/task",
      "name": "lambda_function",
      "version": "0.1.1"
    },
    {
      "path": "/var/runtime",
      "name": "bootstrap",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "boto3",
      "version": "1.9.42"
    },
    {
      "path": "/var/runtime",
      "name": "botocore",
      "version": "1.12.42"
    },
    {
      "path": "/var/runtime",
      "name": "dateutil",
      "version": "2.7.5"
    },
    {
      "path": "/var/runtime",
      "name": "docutils",
      "version": "0.14"
    },
    {
      "path": "/var/runtime",
      "name": "jmespath",
      "version": "0.9.3"
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_client",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_exception",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_marshaller",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "s3transfer",
      "version": "0.1.13"
    },
    {
      "path": "/var/runtime",
      "name": "six",
      "version": "1.11.0"
    },
    {
      "path": "/var/runtime",
      "name": "test_bootstrap",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "test_lambda_runtime_client",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "test_lambda_runtime_marshaller",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "urllib3",
      "version": "1.24.1"
    },
    {
      "path": "/var/lang/lib/python3.7",
      "name": "__future__",
      "version": null
    },
...

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

  • Операційна система - Amazon Linux
  • AMI - amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
  • Ядро Linux - 4.14.77-70.59.amzn1.x86_64
  • AWS SDK для JavaScript - 2.290.0 \
  • SDK для Python (Boto 3) - 3-1.7.74 botocore-1.10.74

1

Установка

pip install pkgutil

Код

import pkgutil

for i in pkgutil.iter_modules(None): # returns a tuple (path, package_name, ispkg_flag)
    print(i[1]) #or you can append it to a list

Вибірка зразка:

multiprocessing
netrc
nntplib
ntpath
nturl2path
numbers
opcode
pickle
pickletools
pipes
pkgutil

1

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

import subprocess
import sys
from pprint import pprint

installed_packages = reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze']).decode('utf-8')
installed_packages = installed_packages.split('\r\n')
installed_packages = [pkg.split('==')[0] for pkg in installed_packages if pkg != '']
pprint(installed_packages)


-10

З оболонки

ls site-packages

Якщо це не корисно, ви можете це зробити.

import sys
import os
for p in sys.path:
    print os.listdir( p )

І подивіться, що це дає.


який каталог сайтів-пакунків? Це може зробити краще: ls / usr / {local /,} lib / python $ (python -V 2> & 1 | cut -d "" -f2 | cut -d. -F1-2) / site-пакети
vezult

Також це не буде відображати вбудовані модулі, або модулі у власному PYTHONPATH, або такі, що встановлені в setuptools "режимі розвитку" тощо
dF.

Мій /usr/local/lib/python2.5/site-packages порожній, хоча у мене встановлені модулі.
Лео Леопольд Герц 준영

14
Кудос за те, що не видалив цю відповідь на зворотній основі. Корисно громаді зрозуміти, чому загальна відповідь вважається неправильною.
Джеремі Штейн

1
@JeremyStein Кращою стратегією (більш корисною та, мабуть, меншою мірою повторною) може бути відредагувати питання, щоб пояснити, чому це неправильно, як тільки це було пояснено в коментарях ...
Kyle Strand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.