Как проверить, на какой двоичный библиотечный файл ссылается python?
Некоторое время назад я установил dynet для Python, и он работал нормально. Я установил его автоматически с pip install git+https://github.com/clab/dynet#egg=dynet
,
Затем я хотел добавить поддержку MKL. Поэтому я снова установил dynet вручную, используя инструкции здесь: http://dynet.readthedocs.io/en/latest/python.html, передав -DMKL
параметр для создания.
Я хочу убедиться, что я все сделал правильно и что Python действительно берет новую установку dynet. Как я могу это проверить?
В общем, когда у меня есть библиотека, которая встроена в C++ и связана с Python, как я могу проверить из Python детали установленной библиотеки и, в частности, на какой двоичный файл ссылается Python?
3 ответа
Это сложно. Не существует стандартного способа, вы должны полагаться на информацию, предоставляемую пакетом (чего многие не делают) и на детали реализации для конкретной библиотеки.
Библиотеки Python часто выставляют свой номер версии в __version__
приписывать. Этот атрибут не стандартизирован, это самое большее соглашение. dynet
У библиотеки есть этот атрибут, но он не перечисляет версию уровня патча, только основные и второстепенные версии:
>>> import dynet
>>> dynet.__version__
'2.0'
Потому что вы установили библиотеку либо непосредственно из системы контроля версий (с git+https://...
) или вручную из источника, вы не можете использовать pip freeze
или же pkg_resources.get_distribution()
проверить версию либо:
$ pip freeze | grep -i dynet
dyNET==0.0.0
Флаги компиляции нигде не хранятся, обычно. Python предоставляет свою собственную информацию времени компиляции в структурах в sys
модуль и sysconfig
модуль, но нет такой возможности для модулей расширения. Если модуль расширения явно не включает такую информацию в API, вам там не повезло.
В лучшем случае вы можете попытаться найти фактический загруженный динамический модуль. Во многих проектах используется модуль-обертка Python, который косвенно загружает сам модуль расширения, что приводит к путанице. В этом случае импорт dynet
дает вам dynet.py
файл:
>>> dynet.__file__
'/.../lib/python3.6/site-packages/dynet.py'
Этот файл был сгенерирован из dynet.py.in
файл в исходном коде проекта. Импортирует динамический модуль как _dynet
:
from _dynet import *
Таким образом, вы по крайней мере можете найти местоположение динамического объекта, загруженного с помощью:
>>> import _dynet
>>> _dynet.__file__
'/.../lib/python3.6/site-packages/_dynet.cpython-36m-darwin.so'
Вы можете дополнительно проверить, на что ссылается эта динамическая библиотека, если хотите проверить, что они являются правильными версиями; как вы это делаете, зависит от платформы:
- В большинстве систем UNIX вы бы использовали
ldd
см. Как показать все общие библиотеки, используемые исполняемыми файлами в Linux? - На OS X используйте
otool -L
вместо этого посмотрите, что такое лязговой аналог ldd? - В Windows вам нужен сторонний инструмент, такой как средство обхода зависимостей или VS
dumpbin
инструмент, см. Как проверить зависимость от DLL?
3 способа из этого источника:
>>> import django
>>> django.__version__
'1.8'
>>>
>>> import flask
>>> flask.__version__
'0.11.1'
>>>
>>> import urllib2
>>> urllib2.__version__
'2.7'
>>>
>>> import json
>>> json.__version__
'2.0.9'
Или с помощью pkg_resources
>>> import pkg_resources
>>> pkg_resources.get_distribution('flask').version
Или с помощью pip freeze
pip freeze | find /I "virtualenv"
Не очень понятно с вашим вопросом. Но вы можете увидеть все установленные библиотеки, выполнив следующую команду.
pip freeze
В нем будут перечислены все библиотеки, установленные в вашей среде, а также номер версии.