Вам нужно знать сигнатуры функций в общем объекте. У вас есть исходный код или какая-то ссылка, объясняющая имена функций и типы аргументов?
Например, у меня есть этот исходный код (mult.f90):
integer function multiply(a, b)
integer, intent(in) :: a, b
multiply = a * b
end function multiply
.. и чтобы продемонстрировать, как вы можете загружать и использовать несколько общих объектов одновременно, у меня также есть (add.f90):
integer function addtwo(a, b)
integer, intent(in) :: a, b
addtwo = a + b
end function addtwo
Скомпилируйте, исследуйте символы:
% gfortran-4.4 -shared -fPIC -g -o mult.so mult.f90
% gfortran-4.4 -shared -fPIC -g -o add.so add.f90
% nm -ao mult.so | grep multiply
mult.so:00000000000005cc T multiply_
Обратите внимание, что к имени символа в общем объекте добавлено подчеркивание. Поскольку у меня есть исходный код, я знаю, что это подпись multiply_(int *a, int *b)
, поэтому легко вызвать эту функцию из ctypes
:
from ctypes import byref, cdll, c_int
mult = cdll.LoadLibrary('./mult.so')
add = cdll.LoadLibrary('./add.so')
a = c_int(2)
b = c_int(4)
print mult.multiply_(byref(a), byref(b))
print add.addtwo_(byref(a), byref(b))
Вывод:
8
6
person
samplebias
schedule
28.04.2011