Как проверить, на какой двоичный библиотечный файл ссылается 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'

Вы можете дополнительно проверить, на что ссылается эта динамическая библиотека, если хотите проверить, что они являются правильными версиями; как вы это делаете, зависит от платформы:

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 

В нем будут перечислены все библиотеки, установленные в вашей среде, а также номер версии.

Другие вопросы по тегам