我需要从 python 内部调用第三方 c 函数。为此,我创建了 ac api,它具有所有 python 特定的 c 代码(使用 METH_VARARGS)来调用第三方函数。我将此代码 liba.so 与 3 方库 libb.so 链接在我的 python 文件中,我正在做:
import liba *
Python 现在抱怨 libb.so not found。我究竟做错了什么 ?
我需要从 python 内部调用第三方 c 函数。为此,我创建了 ac api,它具有所有 python 特定的 c 代码(使用 METH_VARARGS)来调用第三方函数。我将此代码 liba.so 与 3 方库 libb.so 链接在我的 python 文件中,我正在做:
import liba *
Python 现在抱怨 libb.so not found。我究竟做错了什么 ?
你必须包含liba.so
在你的 PATH 中,否则 Python 将不知道在哪里寻找它。
试试下面的代码,如果它可以从PATH中找到它就会加载库,否则它会尝试从加载脚本的目录加载它
from ctypes import *
from ctypes.util import find_library
import os
if find_library('a'):
liba = CDLL(find_library('a'))
else:
# library is not in your path, try loading it from the current directory
print 'liba not found in system path, trying to load it from the current directory'
print '%s/%s'%(os.path.dirname(__file__),'liba.so')
liba = CDLL(os.path.join(os.path.dirname(__file__),'liba.so'))
http://docs.python.org/library/ctypes.html#finding-shared-libraries
更新:我想知道您为什么创建一个本地库 ( liba
) 来访问本地 3rd 方库 ( libb
)。您可以使用将第三方 c 库直接导入 pythonctypes
并为libb
. 例如调用标准的 c libtime
你会做
>>> from ctypes import *
>>> lib_c = CDLL("libc.so.6")
>>> print lib_c.time(None)
1150640792
对于 libb
>>> from ctypes import *
>>> lib_b = CDLL("libb")
>>> lib_b.hello_world(None)