场景:
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以及我熟悉的东西的信息。
感谢您的时间和知识!