Вызов сторонней функции c из python

У меня есть требование вызова сторонних функций изнутри Python. Для этого я создал ac api, в котором есть весь специфический для Python код c (использующий METH_VARARGS) для вызова сторонних функций. Я связал этот код liba.so с 3-сторонней библиотекой libb.so В моем файле python я делаю:

import liba *

Python теперь жалуется, что libb.so не найден. Что я делаю неправильно?

1 ответ

Вы должны включить 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

ОБНОВЛЕНИЕ: мне было интересно, почему вы создали нативную библиотеку (liba) для доступа к собственной сторонней библиотеке (libb). Вы можете импортировать стороннюю библиотеку c прямо в Python, используя ctypes и создайте оболочку Python (не нативную) для libb, Например, для вызова стандартного 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)
Другие вопросы по тегам