Как я могу получить список локально установленных модулей Python?

998

Я хотел бы получить список модулей 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-репо с 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.

Мы ведем себя setup.pyв /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Установите пакет python из репозитория git
(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
1040
help('modules')

в оболочке / приглашении Python.

ChristopheD
источник
10
@dF pydoc modulesработает. Вы должны представить это как ответ.
Abizern
37
Дала мне ошибку в сегменте!
Занбри
3
Нобар, Занбри, @Джо Фрамбах: в Ubuntu? Здесь описана ошибка: bugs.launchpad.net/ubuntu/+source/python2.7/+bug/896836
ChristopheD
2
Как я могу получить дополнительную информацию о том, где установлены модули и какая текущая версия?
любопытно
5
python -c 'help("modules")'
Кенорб
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

Я говорю «удивительно», потому что инструмент для установки пакетов - это именно то место, где можно было бы ожидать найти эту функциональность, хотя и не под названием «заморозить», но упаковка на python настолько странна, что я поражен тем, что этот инструмент имеет смысл. Пип 0.8.2, Python 2.7.

chiggsy
источник
4
Я предполагаю, что идея этого имени в том, что вы получаете «замороженный» снимок того, что установлено прямо сейчас, который вы можете позже передать обратно в pip, чтобы получить точно такие же модули, установленные в другой среде.
Райан К. Томпсон
Араш, вы также можете установить pip в Windows! Сначала установите setuptools, а затем используйте easy_install для установки pip :)
gawbul
Это отлично, но, похоже, не хватает некоторых библиотек, которые я установил. Например, в нем нет списка PyQt.
Junuxx
8
Начиная с пипа 1.3 есть команда list .
Петр Доброгост
оно работает. Что за беспорядок питон Почему они не могут объединиться и предложить решения, аналогичные тем, которые существуют в Rails? (Gemfile, bundler, rvm)
Димитрис
106

Начиная с версии 1.3, у вас есть доступ к:

pip list

Который кажется синтаксическим сахаром для "замораживания пипса". В нем будут перечислены все модули, относящиеся к вашей установке или virtualenv, а также номера их версий. К сожалению, он не отображает номер текущей версии какого-либо модуля, а также не моет посуду и не светит обувь.

Брайс
источник
4
Здесь также проводится pip list --localразличие между virtualenvглобальными пакетами сайтов, которые обсуждаются здесь .
Иоаннис Филиппидис
1
Безусловно, лучший. Он также получает версии.
Аериман
pip listсамый простой и лучший. Вот варианты и детали.
Леви Багулей
86
  • В ipythonвы можете ввести « importTab».

  • В стандартном интерпретаторе Python вы можете ввести " help('modules')".

  • В командной строке вы можете использовать .pydoc modules

  • В сценарии звоните pkgutil.iter_modules().

Johnsyweb
источник
5
pkgutil.iter_modules()работает, решение pip выше не перечисляет все пакеты, только те, которые установлены через pip.
метапертура
2
Потрясающие! Я думаю, что они улучшили документацию, так как вопрос был задан. pydoc modules spam ищет спам в документах модулей. Последний пункт, кажется, дает вам достаточную информацию для использования модуля. @metaperture Можете ли вы привести пример того, как вы перечисляете все установленные локальные модули (а не массивный список stlib по справке ('modules')) с помощью 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()

который показывает все модули, работающие на вашем питоне.

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

s.modules

Это дикт, содержащий все модули и объекты импорта.

Дэн Эванс
источник
2
# После импорта sys «import sys as s» вы можете печатать с помощью: print sys.modules.keys ()
Дэн Эванс
Не уверен, почему мое сообщение было отредактировано, но спасибо за использование информации, которую я разместил, чтобы исправить ошибки в предыдущих сообщениях. Вы будете возвращать ошибки, если будете использовать help () против help (''). Это относится и к dir ('') & sys ('') и т. Д. Надеюсь, что это помогает и не удаляется.
Дэн Эванс
Проигнорируйте мое последнее сообщение, это сообщение не было отредактировано. Я думал о похожем посте, найденном здесь: stackoverflow.com/questions/139180/… Извините за путаницу.
Дэн Эванс
7
Upvoted, потому что это единственный метод, который работает на ограниченных системах, которые не установлены и pydocне pipустановлены (в моем случае это NAS).
Томас
1
Договорились с Томасом. Я использую repl.it, например, который также является типом среды с ограничениями. help('modules')просто висит без ответа для меня. Но этот подход sys
Сергей Колодяжный
63

В обычной оболочке просто используйте

pydoc modules
DrkNess
источник
Похоже, что выше работает только на платформах 'nix. В любом случае, я нашел и запустил скрипт, адаптировав команду следующим образом: модули c: \ bin \ pythos_2.7 \ lib \ pydoc.py - этот список занял целую вечность, формат отстой, и он не устанавливает установленную версию число. Я передам.
Дэвид А. Грей,
2
@ DavidA.Gray Только что попробовал это на машине Windows с Python 3, и это действительно работает. С помощью окна запуска 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для того же. Вот альтернативная версия, которая работает с пип 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.

Big_Al_Tx
источник
2
Я искал это решение и ломал голову, пытаясь выяснить pkg_resources. Если бы я мог сказать это несколько раз, я бы это сделал. Спасибо, @Big_Al_Tx! Обновление: за исключением .... когда я делаю 'pip freeze' в моей виртуальной среде и сравниваю его с выводом этого, есть пакеты, которые отсутствуют. Есть мысли о том, почему это могло / могло произойти?
номер
@numberwhun - Я рад, что это сработало для тебя. Извините, но у меня нет ответа на расхождение с pip freeze; глубина моих знаний по этой теме довольно ограничена. Я вроде как нашел свой путь к решению, когда принятый ответ не работал для меня, и я попытался объединить его с ответом, связанным с этим, setuptoolsи заставил его работать.
Big_Al_Tx
github.com/pypa/pip/issues/5243 - Обсуждение команды разработчиков об удаленном доступе к get_installed_distributions routine.
bl79
@ bl79 - я думаю, что это именно то место, где я получил ссылку setuptools.
Big_Al_Tx
@Big_Al_Tx: Ну, я как бы обошел опцию setuptools (которая была просто обфусцирована для моих нужд), и я пошел с этим: instal_pkgs = subprocess.check_output (['pip', 'freeze']) Это делает именно то, что я нужно было это сделать .... ууу !!
число
26

Если нам нужно перечислить установленные пакеты в оболочке Python, мы можем использовать helpкоманду следующим образом

>>help('modules package')
Sadheesh
источник
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]
stuudent
источник
есть ли причина использовать while вместо цикла for? Я написал, используя, for m in iter_modules()и это сработало.
Жоао Понте
13

на окнах, введите это в cmd

c:\python\libs>python -m pip freeze
Саурабх
источник
Это работало для меня, используя: python3 -m pip freeze - для python 3.5.3.
Дпминуса
Это хорошо работает, и вам не нужно быть в каталоге libs, если ваши переменные определены
mcy
12

Я столкнулся с установленным пользователем Python 2.7 на OS X. Для отображения списка установленных модулей требовался X11 (как с помощью справки, так и с помощью pydoc).

Чтобы иметь возможность вывести список всех модулей без установки X11, я запустил pydoc как http-сервер, то есть:

pydoc -p 12345

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

Qiau
источник
12

Попробуйте это

pip list

или

pip freeze
Амит Гупта
источник
Это работает из оболочки. Но не в
питоне
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
X персонифицированный
источник
Это должен быть принятый ответ! Одна строка :)
Почти Питт
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*******************************)
PADYMKO
источник
Можете ли вы сравнить ваш подход к подходу Адама здесь stackoverflow.com/a/23885252/54964
Лео Леопольд Херц,
@ Лео Леопольд Герц, зачем тебе это?
PADYMKO
Понять, как ваш подход лучше / хуже, чем подход Адама.
Лео Леопольд Герц 준영
1
@ Лео Леопольд Герц. Короткий ответ: попробуй сам в производстве и сделай выводы сам. Длинный ответ: подход Адама основан на pip- системе управления пакетами, используемой для установки и управления пакетами программного обеспечения, написанными на Python, и в результате pip.get_installed_distributions()возвращаются модули, установленные вместе с пипом. Мой ответ полностью основан на стандартной библиотеке Python и охватывает все модули, доступные для импорта. Самый большой недостаток моего ответа - нет поддержки для CPython 2.
PADYMKO
1
@ Лео Леопольд Герц, ты ошибаешься, он делает это. Я проверил это на своем компьютере. Мой ответ содержит особое значение **truncated**, где вывод усекается. Может быть, вы не осторожны, но если это не так, чтобы выслать мне информацию о вашей системе и реализации Python, я сделаю дополнительные исследования, чтобы исправить это.
PADYMKO
9

Предупреждение: Адам Матан не рекомендует это использование в пипсах> 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" там нет.
Александр Стор
8

Помимо использования pip freezeя устанавливал желток в моей виртуальной среде.

jdsantiagojr
источник
6

В случае, если у вас установлен дистрибутив anaconda python , вы также можете использовать

$conda list

в дополнение к решениям, описанным выше.

Shreyas
источник
Где / как вы запускаете эту линию?
HuckIt
Если вы работаете на компьютере с UNIX / Mac OS X, откройте терминал и просто наберите conda install
текст
Я на машине с 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
yegle
источник
Команда sys.modules не работает в новейшем OSX Python. NameError: имя 'system' не определено .
Лео Леопольд Герц 준영
@Masi Вы имели в виду /usr/bin/pythonили тот, что пришел с python.org ? Для первого я могу использовать sys.modulesбез проблем.
Yegle
Я имею в виду / usr / bin / python .
Лео Леопольд Герц 준영
@ Маси Не уверен, если вы все еще заинтересованы в этой проблеме. Видимо, вы используете 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


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

not2qubit
источник
3

Есть много идей, вначале я размышляю над этими двумя:

зернышко

минусы: не всегда установлены

помощь ( «модули»)

минусы: вывод на консоль; со сломанными модулями (см. Ubuntu ...) можно segfault

Мне нужен простой подход, использующий базовые библиотеки и совместимый со старым Python 2.x

И я вижу свет: listmodules.py

В каталоге исходных текстов документации в 2.5 скрыт небольшой скрипт, в котором перечислены все доступные модули для установки на Python.

Плюсы:

использует только imp, sys, os, re, time

предназначен для работы на Python 1.5.2 и новее

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

Massimo
источник
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)
Eli
источник
-1

Для тех, кто интересуется, как звонить pip listиз программы Python, вы можете использовать следующее:

import pip
pip.main(['list])  # this will print all the packages
Марсело Вилла-Пинерос
источник
Нет. Это не рекомендуется, см. Здесь: pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program
sinoroc
-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-packages
vezult
Также это не будет показывать встроенные модули, или модули в пользовательском PYTHONPATH, или модули, установленные в setuptools в «режиме разработки» и т. Д.
dF.
Мой /usr/local/lib/python2.5/site-packages пуст, хотя я установил модули.
Лео Леопольд Герц 준영
14
Слава за то, что не удалил этот опровергнутый ответ. Сообществу полезно понять, почему общий ответ считается неправильным.
Джереми Стейн
1
@JeremyStein Лучшей стратегией (более полезной и, возможно, менее повреждающей репутацию), вероятно, будет редактирование вопроса, чтобы объяснить, почему это неправильно, как только это будет объяснено в комментариях ...
Кайл Стрэнд,