我试图让一些开源学术代码工作(项目主页是here)。它是一个很大的C++代码库,它有一个非常薄的python包装器,它使用CDLL
来加载C++并调用一些可用的C函数来允许代码的原始python脚本。python加载与CDLL c lib,没有看到python路径中的库
然而,最初的导入代码崩溃,因为它无法找到.so文件坐在旁边给它的站点包:
from ctypes import *
try:
self.lib = CDLL("_lammps.so")
except:
try:
self.lib = CDLL("_lammps_serial.so")
except:
raise OSError,"Could not load LAMMPS dynamic library"
,并在脚本:
在安装文件或解释:
from lammps import lammps
l = lammps()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lammps.py", line 42, in __init__
raise OSError,"Could not load LAMMPS dynamic library"
OSError: Could not load LAMMPS dynamic library
其他答案might seem to have this covered,但这只适用于如果CDLL()
实际上是调用脚本中调用(或工作目录在运行解释器的提示符处) - 即,如果'相对路径'在用户空间而不是python-library-space中。
我们如何可靠地安装导入我们自己构建的C/C++库?对污染系统库位置如/usr/lib
这不是很pythonic,我看不到一个简单的解决方案。
(编辑:更正函数名,重构不清楚无益的后悔!)下使用strace -eopen
更进一步:有问题的库有一个符号丢失,所以这段代码可能掩盖了一个不同的错误;人们不应该假设你知道系统异常是什么,并抛出你自己的!事实上,这个问题在进一步调查后仍然有效;系统*是第一次抛出正确的错误(我通过将.so复制到'/ usr/lib'并在交互式提示符下运行'CDLL()'来测试。) – tehwalrus 2012-02-05 10:35:09