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

769

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

Как вы можете получить список модулей Python, установленных на вашем компьютере?

  • 66
    Вы можете просто сделать >>> help (), а затем >>> модули
  • 1
    Есть ли альтернатива? help () зависает для меня.
Показать ещё 1 комментарий
Теги:
pip
module

23 ответа

549
Лучший ответ

Решение

Мои 50 центов для получения списка pip freeze от Python script:

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 и (god forbid) 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) $ 
Clone a 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.

Ведем setup.py в /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Установите пакет python из репозитория git
(test_env) $ cd /tmp/behave && python setup.py 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 setup.py файл.

Я не могу найти ссылку на эту проблему в документации. Возможно, я открою для него ошибку.

  • 5
    Спасибо за этот ответ! Я думаю, что это лучше отвечает на вопрос, потому что я задаю «локально» установленные модули Python. Замораживание пипсов тоже не всегда так. Это работает лучше - я думаю.
  • 0
    pkgutil.iter_modules() работает (см. ответ @ Johnysweb); это решение pip выше не перечисляет все пакеты, только те, которые установлены через pip
Показать ещё 22 комментария
868
help('modules')

в командной строке Python.

  • 0
    Я получаю такое предупреждение: FutureWarning: API-интерфейс apt еще не стабилен warnings.warn («API-интерфейс apt еще не стабилен», FutureWarning). Я не получил список модулей Python. Я использую Python 2.5.
  • 0
    Не могли бы вы вставить все предупреждение, например, на paste.pocoo.org и разместить ссылку здесь?
Показать ещё 15 комментариев
228

Теперь, эти методы я пробовал самостоятельно, и я получил именно то, что было рекламировано: Все модули.

Увы, действительно вам все равно, о 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

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

  • 3
    Есть ли в Windows эквивалентная команда для этого?
  • 4
    Я предполагаю, что идея, стоящая за названием, заключается в том, что вы получаете «замороженный» снимок того, что установлено прямо сейчас, который вы можете позже передать обратно в pip, чтобы получить точно такие же модули, установленные в другой среде.
Показать ещё 9 комментариев
77
  • В ipython вы можете ввести "import Tab".

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

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

  • В script вызовите pkgutil.iter_modules().

  • 5
    pkgutil.iter_modules() работает, решение pip выше не перечисляет все пакеты, только те, которые установлены через pip.
  • 2
    Потрясающие! Я думаю, что они улучшили документацию, так как вопрос был задан. pydoc modules spam ищет спам в документах модулей. Последний пункт, кажется, дает вам достаточную информацию для использования модуля. @metaperture Можете ли вы привести пример того, как вы перечисляете все установленные локальные модули (а не массивный список stlib по справке ('modules')) с помощью pkgutil.iter_modules () .
Показать ещё 1 комментарий
72

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

pip list

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

  • 3
    Существует также pip list --local для различия между virtualenv и глобальными пакетами сайтов, которые обсуждаются здесь .
54

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

pydoc modules
  • 0
    Похоже, что выше работает только на платформах 'nix. В любом случае, я нашел и запустил скрипт, адаптировав команду следующим образом: модули c: \ bin \ pythos_2.7 \ lib \ pydoc.py - этот список занял целую вечность, формат отстой, и он не устанавливает установленную версию число. Я передам.
  • 1
    @ DavidA.Gray Только что попробовал это на машине Windows с Python 3, и это действительно работает. Используя окно запуска Python, вы можете py -m pydoc modules в cmd или Powershell.
54

Я просто использую это, чтобы видеть используемые в настоящее время модули:

import sys as s
s.modules.keys()

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

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

s.modules

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

  • 1
    импортировать sys как s
  • 1
    # После импорта sys "import sys as s" вы можете печатать с помощью: print sys.modules.keys ()
Показать ещё 6 комментариев
23

Начиная с 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.

  • 1
    Я искал это решение и ломал голову, пытаясь выяснить pkg_resources. Если бы я мог сказать это несколько раз, я бы это сделал. Спасибо, @Big_Al_Tx! Обновление: за исключением .... когда я выполняю 'pip freeze' в моей виртуальной среде и сравниваю его с выводом этого, есть пакеты, которые отсутствуют. Есть мысли о том, почему это могло / могло произойти?
  • 0
    @numberwhun - Я рад, что это сработало для тебя. Извините, но у меня нет ответа на несоответствие с pip freeze ; глубина моих знаний по этой теме довольно ограничена. Я как-то нащупал свой путь к решению, когда принятый ответ не работал для меня, и я попытался объединить его с ответом, связанным с setuptools и заставил его работать.
Показать ещё 5 комментариев
20

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

>>help('modules package')
  • 0
    это лучший способ
11

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

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

pydoc -p 12345

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

10

Очень простой поиск с использованием 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]
9

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

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

Я обычно использую pip list чтобы получить список пакетов (с версией).

Конечно, это работает и в виртуальной среде.

7

Помимо использования pip freeze, я устанавливал yolk в своих виртуальных средах.

6

Это решение основано на модулях importlib и pkgutil и работает с CPython 3.4 и CPython 3.5, но не поддерживает CPython 2.


Объяснение

  • sys.builtin_module_names - называет все встроенные модули (посмотрите мой ответ здесь)
  • pkgutil.iter_modules() - возвращает информацию обо всех доступных модулях
  • importlib.util.find_spec() - возвращает информацию о модуле импорта, если существует
  • BuiltinImporter - импортер встроенных модулей (docs)
  • SourceFileLoader - импортер стандартного модуля Python (по умолчанию имеет расширение *.py) (docs)
  • ExtensionFileLoader - импортер для модулей как общая библиотека (написанная на 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*******************************)
  • 0
    Можете ли вы сравнить ваш подход к подходу Адама здесь stackoverflow.com/a/23885252/54964
  • 0
    @ Лео Леопольд Герц, зачем тебе это?
Показать ещё 3 комментария
6
  • чтобы получить все доступные модули, запустите sys.modules
  • чтобы получить все установленные модули (чтение: установлено 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
  • 0
    Команда sys.modules не работает в новейшем OSX Python. NameError: имя 'system' не определено .
  • 0
    @Masi Вы имели в виду /usr/bin/python или тот, что пришел с python.org ? Для первого я могу использовать sys.modules без проблем.
Показать ещё 3 комментария
4

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

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

Это было вдохновлено ответом Адама Матана (принятым):

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 и один раз без него, один имеет приоритет, так что другой не отображается в списке (отображается только одно местоположение). Я считаю, что в списке будет только один из них в локальном каталоге. Это может быть улучшено.

3

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

$conda list

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

  • 0
    Где / как вы запускаете эту линию?
  • 0
    Если вы работаете на компьютере с UNIX / Mac OS X, откройте терминал и просто наберите conda install , он должен работать :)
Показать ещё 1 комментарий
1

Есть много способов снять кожу с кошки.

  • Самый простой способ - использовать функцию pydoc непосредственно из оболочки:
    pydoc modules

  • Но для получения дополнительной информации используйте инструмент под названием pip-date, который также сообщит вам даты установки.
    pip install pip-date


Изображение 2513

1

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

зернышко

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

помочь ( "модули")

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

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

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

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

Плюсы:

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

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

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

0

Если вы используете Python 3

Я только что попробовал на Ubuntu, и, похоже, сработало

Debian/Ubuntu: sudo apt-get install python3-matplotlib

Fedora: sudo dnf install python3-matplotlib

Red Hat: sudo yum install python3-matplotlib

Арка: sudo pacman -S python-matplotlib

Источник: https://matplotlib.org/users/install.html

-9

Из оболочки

ls site-packages

Если это не поможет, вы можете сделать это.

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

И посмотрим, что это производит.

  • 0
    какой каталог сайтов-пакетов? Это может быть лучше: ls / usr / {local /,} lib / python $ (python -V 2> & 1 | cut -d "" -f2 | cut -d. -F1-2) / site-packages
  • 0
    Также это не будет отображать встроенные модули, или модули в пользовательском PYTHONPATH, или модули, установленные в setuptools в «режиме разработки» и т. Д.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню