我需要从python内部调用第三方c函数。 为此,我创建了一个c api,其中包含所有python特定的c代码(使用METH_VARARGS)来调用第三方函数。我将此代码liba.so与3方库libb.so相关联 在我的python文件中,我正在做:
import liba *
Python现在抱怨libb.so没找到。 我做错了什么?
答案 0 :(得分:2)
您必须在PATH中包含liba.so
,否则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
)来访问本机第三方库(libb
)。您可以使用ctypes
将第三方c库直接导入到python中,并为libb
创建一个python(非本机)包装器。例如,调用标准c lib time
,你会做
>>> 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)