Как получить список локально установленных модулей Python?
Я хотел бы получить список модулей Python, которые находятся в моей установке Python (сервер UNIX).
Как вы можете получить список модулей Python, установленных на вашем компьютере?
20 ответов
решение
мои 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
Я получаю список пакетов, установленных на 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 && 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
' s setup.py
файл.
я не смог найти ссылки на эту проблему в документации. Возможно, я открою для него жука.
теперь, эти способы я попробовал сам, и я получил именно то, что было объявлено: все модули.
увы, на самом деле вы не очень заботитесь о 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
Я говорю "удивительно", потому что инструмент установки пакета является точным место можно было бы ожидать, чтобы найти эту функциональность, хотя и не под названием "заморозить", но упаковка python настолько странная, что я поражен, что этот инструмент имеет смысл. Pip 0.8.2, Python 2.7.
на
ipython
вы можете типа "import
Tab".в стандартном интерпретаторе Python вы можете ввести"
help('modules')
".в командной строке, вы можете использовать
pydoc
modules
.в скрипте вызов
pkgutil.iter_modules()
.
начиная с pip версии 1.3, у вас есть доступ к:
pip list
который кажется синтаксическим сахаром для "замораживания pip". В нем будут перечислены все модули, относящиеся к вашей установке или virtualenv, а также их номера версий. К сожалению, он не отображает текущий номер версии любого модуля, а также не моет посуду или чистит обувь.
Я просто использую это, чтобы увидеть используемые в настоящее время модули:
import sys as s
s.modules.keys()
который показывает все модули, работающие на вашем python.
для всех встроенных модулей использование:
s.modules
который является dict, содержащим все модули и объекты импорта.
Если нам нужно перечислить установленные пакеты в оболочке Python, мы можем использовать следующим образом
>>help('modules package')
я столкнулся с пользовательским установленным python 2.7 на OS X. Это потребовало X11 для списка установленных модулей (как с помощью справки, так и с помощью 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]
по состоянию на pip 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
я устанавливал желток в моих виртуальных сред.
- чтобы получить все доступные модули, запустить
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
- импортер встроенных модулей (docs) -
SourceFileLoader
- импортер стандартного модуля Python (по умолчанию имеет расширение *.py) (docs) -
ExtensionFileLoader
- импортер модулей as общая библиотека (написанные на 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*******************************)
в случае, если у вас есть распределение Anaconda python установлен, вы также можете использовать
$conda list
в дополнение к описанным выше решениям.
pip freeze все ли это находит пакеты, однако можно просто написать следующую команду, чтобы перечислить все пути, где находятся пакеты python.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Я обычно использую pip list
чтобы получить список пакетов (с версией).
это работает и в виртуальной среде, конечно.
есть много идей, первоначально я размышляю над этими двумя:
Пип
минусы: не всегда установлен
помочь ("модули")
минусы: вывод на консоль; со сломанными модулями (см. ubuntu...) может обработка выхода онлайн / оффлайн
Мне нужен простой подход, используя базовые библиотеки и совместимый со старым python 2.x
и я вижу свет: listmodules.py
в исходном каталоге документации в 2.5 скрыт небольшой скрипт, в котором перечислены все доступные модули для установки Python.
плюсы:
использует только imp, sys, os, re, time
предназначен для работы на Python 1.5.2 и новее
исходный код действительно компактный, поэтому вы можете легко возиться с ним, например, передать список исключений багги-модулей (не попробуйте импортировать их)
из командной строки
ls site-packages
Если это не поможет, вы можете сделать это.
import sys
import os
for p in sys.path:
print os.listdir( p )
и посмотрите, что производит.