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

StackOverflow https://stackoverflow.com/questions/739993

  •  09-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Решение

Не используйте с 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 Я получаю список пакетов, установленных в виртуальной среде сервера.Это значительно упрощает отладку.

Предостережения

Я заметил странное поведение этого метода — когда интерпретатор 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 файл.

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

Другие советы

help('modules')

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

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

Увы, на самом деле вас не особо волнует 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 настолько странная, что я ошеломлен тем, что этот инструмент имеет смысл.Пип 0.8.2, Питон 2.7.

  • В ipython вы можете ввести "importВкладка".

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

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

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

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

pip list

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

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

import sys as s
s.modules.keys()

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

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

s.modules

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

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

pydoc modules

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

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

>>help('modules package')

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

Конечно, это работает и в виртуальной среде.Чтобы показать, что установлено только в виртуальной среде (а не в глобальных пакетах), используйте pip list --local.

Вот документация показываю все доступные pip list варианты, с несколькими хорошими примерами.

Очень простой поиск с помощью 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]

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

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

pydoc -p 12345

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

в Windows введите это в cmd

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

Это было вдохновлено книгой Адама Матана. отвечать (принятый):

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

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

  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

Это решение в основном основано на модулях 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*******************************)

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

$conda list

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

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

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

Идей много, изначально я обдумываю эти две:

пункт

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

помощь('модули')

минусы:вывод на консоль;со сломанными модулями (см. Ubuntu...) может возникнуть ошибка

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

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

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

Плюсы:

использует только имп, система, ОС, ре, время

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

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

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

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

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


enter image description here

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

pip list

или

pip freeze

Мне нужно было найти конкретную версию пакетов, доступных по умолчанию в 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
  • АМИ – 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

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

import pip
pip.main(['list])  # this will print all the packages

Это поможет

В терминале или 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

Из оболочки

ls site-packages

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

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

И посмотрите, что это даст.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top