2014-10-08 150 views
1

调用函数我有Python代码是这样的:从Linux可执行文件

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可执行文件吗?

回答

1

不,我不认为你可以直接调用可执行文件中的函数,但可以调用共享库中的函数。你似乎可以访问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的共享库。现在,您可以使用​​加载并调用其功能:

from ctypes import cdll 

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

也许它会比上述更加复杂。例如,可能有需要传递给lib.classify()的参数,比int类型,字符串等更复杂。没有函数原型我们不能提供建议,但上面通常是您需要做的。

1

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

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

ctypes.CDLL也可以创建可执行文件(现在检查它)。我没有检查它的调用函数。无论如何,你需要在C++代码中用extern "C"声明声明C函数,因为C++编译器在默认情况下为C++函数添加了一些“加下划线的”前缀和后缀(extern "C"将其关闭)。

复杂的数据通常作为内存指针传输到C代码中(ctypes.POINTER可能有用)。

+0

我猜ctype是windows可执行文件,如dll或exe,但在我的情况下,我有linux可执行文件 – puncrazy 2014-10-08 14:02:09

+0

它也应该适用于Linux。例如: testlib = ctypes.CDLL('/ full/path/to/testlib.so') – 2014-10-08 14:03:32

+0

再次感谢,我试过这个' dll = ctypes.CDLL('svm_classify')'这会给出错误'OSError:svm_classify:无法打开共享对象文件:没有这样的文件或目录。该文件是在同一目录,并且还导入了dll – puncrazy 2014-10-08 14:15:32

相关问题