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

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

import liba *

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


person marvel    schedule 24.08.2012    source источник


Ответы (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#finding-shared-libraries

ОБНОВЛЕНИЕ: мне интересно, почему вы создали собственную библиотеку (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

и для либб

>>> from ctypes import *
>>> lib_b = CDLL("libb")
>>> lib_b.hello_world(None)
person Matti Lyra    schedule 24.08.2012
comment
Я убедился, что liba.so и libb.so находятся на моем пути. Все еще есть та же проблема. libb.so (сторонняя библиотека) не найдена - person marvel; 25.08.2012
comment
Он может найти liba.so .. но жалуется на libb.so, который связан с liba.so. Я убедился, что libb.so также находится в пути - person marvel; 27.08.2012
comment
Итак, если вы сделаете CDLL(find_library('b')), это сработает? Также заметил, что вы импортируете liba немного странно, вы должны либо сделать import liba, либо from lib import *, а не import liba * последний недопустимый синтаксис ` - person Matti Lyra; 27.08.2012
comment
Вызовы сторонних функций слишком сложны, и мой API предназначен для защиты пользователя Python от этого. - person marvel; 28.08.2012
comment
Также я отследил проблему до dlopen, где он пытается разрешить все символы. Я хочу, чтобы dlopen находился в режиме RTLD_LAZY. Думаю, я могу сделать это только через ctypes(lib_name.mode=1). Есть ли способ сделать это через оператор импорта? - person marvel; 28.08.2012
comment
В документации по Python сказано, что RTLD_LAZY является режимом по умолчанию для dl.open docs.python. org/library/dl.html#dl.open. Я рад помочь вам отладить это, но я думаю, что мне понадобится пример кода для libb и liba, чтобы двигаться вперед. - person Matti Lyra; 28.08.2012