2014-10-08 117 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