Я хотел бы получить список модулей Python, которые находятся в моей установке Python (сервер UNIX).
Как вы можете получить список модулей Python, установленных на вашем компьютере?
Мои 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
файл.
Я не могу найти ссылку на эту проблему в документации. Возможно, я открою для него ошибку.
pkgutil.iter_modules()
работает (см. ответ @ Johnysweb); это решение pip выше не перечисляет все пакеты, только те, которые установлены через pip
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 настолько странная, что я ошеломлен тем, что этот инструмент имеет смысл. Pip 0.8.2, Python 2.7.
В ipython
вы можете ввести "import
Tab".
В стандартном интерпретаторе Python вы можете ввести "help('modules')
".
В командной строке вы можете использовать pydoc
modules
.
В script вызовите pkgutil.iter_modules()
.
pkgutil.iter_modules()
работает, решение pip выше не перечисляет все пакеты, только те, которые установлены через pip.
Начиная с версии версии 1.3, у вас есть доступ к:
pip list
Кажется, что это синтаксический сахар для "замораживания контура". В нем будут перечислены все модули, относящиеся к вашей установке или virtualenv, а также их номера версий. К сожалению, он не отображает текущий номер версии любого модуля и не моет ваши блюда или не блещет вашими ботинками.
pip list --local
для различия между virtualenv
и глобальными пакетами сайтов, которые обсуждаются здесь .
В обычной оболочке просто используйте
pydoc modules
py -m pydoc modules
в cmd или Powershell.
Я просто использую это, чтобы видеть используемые в настоящее время модули:
import sys as s
s.modules.keys()
который показывает все модули, запущенные на вашем питоне.
Для всех встроенных модулей используйте:
s.modules
Что такое dict, содержащий все модули и объекты импорта.
Начиная с 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.
pip freeze
; глубина моих знаний по этой теме довольно ограничена. Я как-то нащупал свой путь к решению, когда принятый ответ не работал для меня, и я попытался объединить его с ответом, связанным с setuptools
и заставил его работать.
Если нам нужно вывести список установленных пакетов в оболочке Python, мы можем использовать команду help
следующим образом
>>help('modules package')
Я столкнулся с пользовательским установленным python 2.7 на OS X. Он потребовал, чтобы X11 отображал установленные модули (как с помощью help, так и pydoc).
Чтобы иметь возможность перечислять все модули без установки X11, я запускал pydoc в качестве http-сервера, то есть:
pydoc -p 12345
Затем можно направить Safari на http://localhost:12345/
, чтобы увидеть все модули.
Очень простой поиск с использованием 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]
в окнах, введите это в cmd
c:\python\libs>python -m pip freeze
Я обычно использую pip list
чтобы получить список пакетов (с версией).
Конечно, это работает и в виртуальной среде.
Помимо использования pip freeze
, я устанавливал yolk в своих виртуальных средах.
Это решение основано на модулях 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*******************************)
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
/usr/bin/python
или тот, что пришел с python.org ? Для первого я могу использовать sys.modules
без проблем.
pip freeze делает все, чтобы найти пакеты, однако можно просто написать следующую команду, чтобы перечислить все пути, в которых находятся пакеты python.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Это было вдохновлено ответом Адама Матана (принятым):
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
и один раз без него, один имеет приоритет, так что другой не отображается в списке (отображается только одно местоположение). Я считаю, что в списке будет только один из них в локальном каталоге. Это может быть улучшено.
Если вы установили дистрибутив anaconda python, вы также можете использовать
$conda list
в дополнение к описанным выше решениям.
conda install
, он должен работать :)
Есть много способов снять кожу с кошки.
Самый простой способ - использовать функцию pydoc
непосредственно из оболочки: pydoc modules
Но для получения дополнительной информации используйте инструмент под названием pip-date, который также сообщит вам даты установки. pip install pip-date
Есть много идей, вначале я размышляю над этими двумя:
зернышко
минусы: не всегда установлены
помочь ( "модули")
минусы: вывод на консоль; со сломанными модулями (см. Ubuntu...) можно segfault
Мне нужен простой подход, использующий базовые библиотеки и совместимый со старым Python 2.x
И я вижу свет: listmodules.py
В каталоге исходных текстов документации в 2.5 скрыт небольшой скрипт, в котором перечислены все доступные модули для установки на Python.
Плюсы:
использует только imp, sys, os, re, time
предназначен для работы на Python 1.5.2 и новее
исходный код действительно компактен, так что вы можете легко переделать его, например, передать список исключений с ошибочными модулями (не пытайтесь импортировать их)
Я только что попробовал на 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
Из оболочки
ls site-packages
Если это не поможет, вы можете сделать это.
import sys
import os
for p in sys.path:
print os.listdir( p )
И посмотрим, что это производит.