我試圖讓一些開源學術代碼工作(項目主頁是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