python共享库加载

时间:2018-06-26 13:59:06

标签: python opencv shared-libraries

场景:

  • Ubuntu 16.04
  • virtualenv中的Python 2.7.12
  • 下载了源代码并使用python绑定编译了OpenCV
  • 在编译过程结束时,我有一个文件lib/cv2.so和其他lib/*.so文件。
  • 我将cv2.so复制到/home/my_user/.venvs/my_venv/lib/python2.7/site-packages/cv2.so

然后(激活了virtualenv):

$ python -c 'import cv2; print "ok!"'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: libopencv_contrib.so.2.4: cannot open shared object file: 
No such file or directory

我注意到python无法找到导入cv2模块所需的共享库。

解决方法1:

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/the/other/so/files/ && python -c 'import cv2; print "ok!"'
ok!

嗯....所以有一个加载器,它正在等待有关在哪里查看共享对象的提示...

解决方法2:

我很惊讶地注意到,如果我将.so文件留在/home/my_user/build/lib中,并且从/home/my_user/执行python,那么根本就不需要设置LD_LIBRARY_PATH。它只是工作。我试图找到一些脚本来设置LD_LIBRARY_PATH,但根本没有设置。

所以我想它将当前目录作为包含库的候选对象(嵌套两个级别?很奇怪)。

为增加混乱感,我注意到我的virtualenv中的许多软件包中都包含.so文件。例如:

my_venv
 └── lib
      └── python2.7
              └──  site-packages
                         └── pandas 
                               └── hashtable.so

(我知道,这并不意味着他们正在使用它...)

但是,如果我为OpenCV及其共享库使用相同的目录结构,则仍然无法正确导入cv2

但这使我更加困惑,因为这些目录在我的主目录下!

所以问题是:

谁负责在cpython中加载共享对象,寻找什么路径?我们需要哪些变量来调整其行为?如何在virtualenv内正确安装cv2(或任何其他具有共享库的编译模块)?

PS:我见过this

我在网上进行了研究,但是我发现所有指向纯python库加载,sys.path以及我熟悉的东西的信息。

感谢您的时间和知识!

0 个答案:

没有答案