我有这样的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
函数吗?
答案 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
可能很有用)。