从linux可执行文件调用函数

时间:2014-10-08 13:25:20

标签: python c

我有这样的python代码:

import svmlight

training_data = __import__('data').train0
test_data = __import__('data').test0
model = svmlight.learn(training_data, type='classification', verbosity=0)
svmlight.write_model(model, 'my_model.dat')
predictions = svmlight.classify(model, test_data)

现在我有linux可执行文件svmlight_classify,对于上面的代码,所有函数也在这个可执行文件中。此可执行文件是使用make命令从c代码创建的。

我可以直接从classify()可执行文件中调用svmlight_classify函数吗?

2 个答案:

答案 0 :(得分:2)

不,我不认为您可以直接调用可执行文件中的函数,但您可以在共享库中调用函数。您似乎可以访问C源代码,因此您应该能够构建如下的共享库:

$ gcc -c -fPIC -o svmlight_classify.o svmlight_classify.c
$ gcc -shared -Wl,-soname,libsvmlight_classify.so -o libsvmlight_classify.so  svmlight_classify.o

这应该会生成一个名为libsvmlight_classify.so的共享库。现在,您可以使用ctypes加载和调用其函数:

from ctypes import cdll

lib = cdll.LoadLibrary('./libsvmlight_classify.so')
lib.classify()

可能会比上面更复杂。例如,可能有一些参数需要传递给类型比int,string等更复杂的lib.classify()。如果没有函数原型,我们无法提供建议,但以上通常是您需要的做。

答案 1 :(得分:1)

您可以使用ctypes标准模块从DLL调用C函数。

import ctypes
dll = ctypes.CDLL('your.dll') # or 'your.exe'
python_int_returned = dll.YourFunc(ctypes.c_int(3)).value

也可以为可执行文件创建ctypes.CDLL(立即检查)。我没有检查它是否有调用功能。无论如何,你需要使用extern "C"语句在C ++代码中声明C函数,因为C ++编译器会添加一些"强调"默认情况下,前缀和后缀为C ++函数的二进制文件(extern "C"将其关闭)。

复杂数据通常作为内存指针传递给C代码(ctypes.POINTER可能很有用)。