从python调用第三方c函数

时间:2012-08-24 22:12:30

标签: python python-c-api python-c-extension

我需要从python内部调用第三方c函数。 为此,我创建了一个c api,其中包含所有python特定的c代码(使用METH_VARARGS)来调用第三方函数。我将此代码liba.so与3方库libb.so相关联 在我的python文件中,我正在做:

import liba *

Python现在抱怨libb.so没找到。 我做错了什么?

1 个答案:

答案 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)