Я хотел бы получить список модулей Python, которые находятся в моей установке Python (сервер UNIX).
Как вы можете получить список модулей Python, установленных на вашем компьютере?
Я хотел бы получить список модулей Python, которые находятся в моей установке Python (сервер UNIX).
Как вы можете получить список модулей Python, установленных на вашем компьютере?
Мои 50 центов за получение списка pip freeze
пипса -like из скрипта 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
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 настолько странная, что я ошеломлен тем, что этот инструмент имеет смысл. Pip 0.8.2, Python 2.7.
В ipython
вы можете ввести "import
Tab".
В стандартном интерпретаторе Python вы можете ввести "help('modules')
".
В командной строке вы можете использовать pydoc
modules
.
В script вызовите pkgutil.iter_modules()
.
Начиная с версии версии 1.3, у вас есть доступ к:
pip list
Кажется, что это синтаксический сахар для "замораживания контура". В нем будут перечислены все модули, относящиеся к вашей установке или virtualenv, а также их номера версий. К сожалению, он не отображает текущий номер версии любого модуля и не моет ваши блюда или не блещет вашими ботинками.
Я просто использую это, чтобы видеть используемые в настоящее время модули:
import sys as s
s.modules.keys()
который показывает все модули, запущенные на вашем питоне.
Для всех встроенных модулей используйте:
s.modules
Что такое dict, содержащий все модули и объекты импорта.
В обычной оболочке просто используйте
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 отображал установленные модули (как с помощью help, так и pydoc).
Чтобы иметь возможность перечислять все модули без установки X11, я запускал pydoc в качестве http-сервера, то есть:
pydoc -p 12345
Затем можно направить Safari на http://localhost:12345/
, чтобы увидеть все модули.
в окнах, введите это в 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 [email protected] [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
, я устанавливал yolk в своих виртуальных средах.
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 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*******************************)
Если у вас установлен дистрибутив anaconda python, вы также можете использовать
$conda list
в дополнение к решениям, описанным выше.
Попробуйте это
pip list
или же
pip freeze
pip freeze делает все, чтобы найти пакеты, однако можно просто написать следующую команду, чтобы перечислить все пути, в которых находятся пакеты python.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Есть много способов снять кожу с кошки.
Самый простой способ - использовать функцию 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 и новее
исходный код действительно компактен, так что вы можете легко переделать его, например, передать список исключений с ошибочными модулями (не пытайтесь импортировать их)
Мне нужно было найти конкретную версию пакетов, доступных по умолчанию в 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
Я только что попробовал на 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
Для тех, кто интересуется, как вызвать 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
Установка
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
Для устаревших модулей попробуйте (Windows)
pip list --outdated
Из оболочки
ls site-packages
Если это не поможет, вы можете сделать это.
import sys
import os
for p in sys.path:
print os.listdir( p )
И посмотрим, что это производит.