如何查看 python link 是什么二进制库文件?
How to check what binary library file does python link to?
不久前,我 installed dynet for Python 并且运行良好。我用 pip install git+https://github.com/clab/dynet#egg=dynet
.
自动安装了它
然后,我想添加 MKL 支持。所以我再次手动安装了 dynet,使用此处的说明:http://dynet.readthedocs.io/en/latest/python.html#manual-installation,将 -DMKL
参数传递给 cmake。
我想确保我所做的一切都是正确的,并且 Python 确实采用了新安装的 dynet。我该如何检查?
一般来说,当我有一个用 C++ 构建并 link 从 Python 编辑的库时,我如何从 Python 中检查已安装的详细信息库,特别是 Python link 到什么二进制文件?
你的问题不是很清楚。
但是您可以通过 运行 下面的命令查看所有已安装的库。
pip freeze
它将列出您环境中安装的所有库及其版本号。
来自 this source 的 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"
这很棘手。没有标准方法,您必须依赖包提供的信息(很多人不这样做)和特定库的实现细节。
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
module and the sysconfig
module 的结构中公开了它自己的编译时信息,但扩展模块没有这样的设施。除非扩展模块在 API 中明确包含此类信息,否则你就不走运了。
充其量,您可以尝试定位实际加载的动态模块。许多项目使用 wrapper Python module,它间接加载实际的扩展模块,使事情变得混乱。在这种情况下,导入 dynet
会得到 dynet.py
文件:
>>> dynet.__file__
'/.../lib/python3.6/site-packages/dynet.py'
此文件是从项目源代码中的 dynet.py.in
file 生成的。它将动态模块导入为 _dynet
:
from _dynet import *
所以你至少仍然可以找到加载的动态对象的位置:
>>> import _dynet
>>> _dynet.__file__
'/.../lib/python3.6/site-packages/_dynet.cpython-36m-darwin.so'
如果你想检查它们是正确的版本,你可以进一步检查动态库链接到什么;你如何做到这一点取决于平台:
- 在大多数 UNIX 系统上,您会使用
ldd
,请参阅 How to show all shared libraries used by executables in Linux?
- 在 OS X 上,使用
otool -L
代替,参见 What is the clang analogue of ldd?
- 在 Windows 上,您需要第三方工具,如 dependency walker 或 VS
dumpbin
工具,请参阅 How to check for DLL dependency?
不久前,我 installed dynet for Python 并且运行良好。我用 pip install git+https://github.com/clab/dynet#egg=dynet
.
然后,我想添加 MKL 支持。所以我再次手动安装了 dynet,使用此处的说明:http://dynet.readthedocs.io/en/latest/python.html#manual-installation,将 -DMKL
参数传递给 cmake。
我想确保我所做的一切都是正确的,并且 Python 确实采用了新安装的 dynet。我该如何检查?
一般来说,当我有一个用 C++ 构建并 link 从 Python 编辑的库时,我如何从 Python 中检查已安装的详细信息库,特别是 Python link 到什么二进制文件?
你的问题不是很清楚。 但是您可以通过 运行 下面的命令查看所有已安装的库。
pip freeze
它将列出您环境中安装的所有库及其版本号。
来自 this source 的 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"
这很棘手。没有标准方法,您必须依赖包提供的信息(很多人不这样做)和特定库的实现细节。
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
module and the sysconfig
module 的结构中公开了它自己的编译时信息,但扩展模块没有这样的设施。除非扩展模块在 API 中明确包含此类信息,否则你就不走运了。
充其量,您可以尝试定位实际加载的动态模块。许多项目使用 wrapper Python module,它间接加载实际的扩展模块,使事情变得混乱。在这种情况下,导入 dynet
会得到 dynet.py
文件:
>>> dynet.__file__
'/.../lib/python3.6/site-packages/dynet.py'
此文件是从项目源代码中的 dynet.py.in
file 生成的。它将动态模块导入为 _dynet
:
from _dynet import *
所以你至少仍然可以找到加载的动态对象的位置:
>>> import _dynet
>>> _dynet.__file__
'/.../lib/python3.6/site-packages/_dynet.cpython-36m-darwin.so'
如果你想检查它们是正确的版本,你可以进一步检查动态库链接到什么;你如何做到这一点取决于平台:
- 在大多数 UNIX 系统上,您会使用
ldd
,请参阅 How to show all shared libraries used by executables in Linux? - 在 OS X 上,使用
otool -L
代替,参见 What is the clang analogue of ldd? - 在 Windows 上,您需要第三方工具,如 dependency walker 或 VS
dumpbin
工具,请参阅 How to check for DLL dependency?