Как я могу получить список локально установленных модулей Python?
Вопрос
Я хотел бы получить список модулей 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
я устанавливал желток в моей виртуальной среде.
- чтобы получить все доступные модули, запустите
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
Это решение в основном основано на модулях importlib
и pkgutil
и работает с CPython 3.4 и CPython 3.5, но не поддерживает CPython 2.
Объяснение
sys.builtin_module_names
- называет все встроенные модули (смотрите мой ответ здесь)pkgutil.iter_modules()
- возвращает информацию обо всех доступных модуляхimportlib.util.find_spec()
- возвращает информацию об импортируемом модуле, если он существуетBuiltinImporter
— импортер встроенных модулей (документы)SourceFileLoader
— импортер стандартного модуля Python (по умолчанию имеет расширение *.py) (документы)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
Попробуйте эти
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 )
И посмотрите, что это даст.