[英]C to Python via Ctypes - Wrapping Struct of Function Pointers to Static Functions
[英]Wrapping c++ functions in python with ctypes on windows : function not found
我需要運行一系列python腳本來計算各種腳本,這些腳本工作正常,但其中一個運行速度很慢,必須用C ++完成。 C ++代碼已准備就緒,但我需要找到一種從python調用C ++函數並獲取返回值的方法。
我找到了有關SWIG的信息,但是沒有讓它在Windows上使用Visual Studio(我必須在Windows上的VS中執行它,因為其他限制)。 我發現使用標准輸入和輸出值的非常簡單的函數更容易使用ctypes。
所以我用ctypes進行了很多測試,嘗試了我在網上找到的所有例子,每次都會發生的事情是我可以加載dll(用visual studio 2012編譯器構建),但是當我嘗試在python中調用函數時,它只是:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print maLib.plop()
File "C:\Python27\lib\ctypes\__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "C:\Python27\lib\ctypes\__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'plop' not found
python代碼是(test.py):
from ctypes import cdll
lib = cdll.LoadLibrary('test')
print lib.plop()
C ++代碼是(test.cpp,編譯為test.dll,Visual Studio設置為構建為dll):
extern "C"
{
int plop();
}
int plop() { return 4; }
正如您所看到的,我試圖讓它盡可能簡單,以避免細節使其失敗。 我已經閱讀了python ctypes幫助,以及如何使用ctypes的教程,嘗試與它們完全相同的代碼,但我不得不適應一點,因為我使用的是Visual Studio / windows,而其他大多數用戶都在使用linux。 所有文件都在同一個文件夾中。
我嘗試了多種加載庫的方法:LoadLibrary('。/ name.dll'),WinDLL('name.dll'),給函數一個不同的名稱,void返回類型等等......
你認為我應該使用SWIG嗎? 我的問題是一個明顯的初學者錯誤嗎? 我是一名學生,對我正在使用的大部分內容都很陌生,但我在這方面付出了很多努力,即使我只需要它來完成一項特定的任務。 當使用SWIG時,我不得不用函數指針或引用創建一個包裝器,所以我認為這是問題,這讓我想嘗試一個更簡單的解決方案。
我正在使用:Python 2.7.7,Visual Studio 2012,Windows 8.1
提前謝謝了
Python報告的錯誤非常清楚。
函數'plop'未找到
這意味着DLL不會導出該名稱的函數。 因此,您需要導出該功能。 使用.def文件或使用__declspec(dllexport)
:
extern "C"
{
__declspec(dllexport) int plop();
}
要檢查DLL以調試此類問題,請使用dumpbin
或Dependency Walker。
請注意,由於未指定調用約定,因此使用缺省的__cdecl
。 這意味着cdll
在ctypes
方面是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.