[英]Cannot call C++ class function in Python
C++ 代碼:
#include <iostream>
class DemoClass{
private:
int a, b;
public:
DemoClass(int v1, int v2){
a = v1;
b = v2;
}
void DemoFunction(){
std::cout << "Hello C++!" << std::endl;
std::cout << "output: a = " << a << ", b = " << b << std::endl;
}
};
extern "C" {
DemoClass* DemoCpp(int v1, int v2){
return new DemoClass(v1, v2);
}
void DemoCppFunction(DemoClass* demo){
demo->DemoFunction();
}
}
通過g++ test.cpp -shared -fPIC -o test.so
Python 腳本:
from ctypes import cdll
lib = cdll.LoadLibrary('./test.so')
class CppClass():
def __init__(self, v1: int, v2: int):
self.obj = lib.DemoCpp(v1, v2)
def demoFunction(self):
lib.DemoCppFunction(self.obj)
f = CppClass(2, 3)
f.demoFunction()
這是我得到的:
Hello C++!
Segmentation fault
我很確定參數已傳遞給 C++ class。我只想知道一種在 C++ class 中調用 function 的方法。
Python 的ctypes
不會為您做很多繁重的工作。 它假設cdll
函數的參數和返回類型都是int
直到證明不是這樣。 因此,雖然您的 C++ 代碼知道它正在返回 DemoClass DemoClass*
,但 Python 會將其截斷為 integer,並且在現代 64 位系統上,指針不適合純整數。
由於您不打算將 Python 中的此指針用於調用 DLL 函數以外的任何其他用途,因此我們不必在 Python 端重構我們的結構。 相反,我們可以使用void*
,指向任意數據的指針類型。 在 Python 中,我們稱這種類型為c_void_p
。
在程序的頂部,在加載 DLL 之后,考慮
lib.DemoCpp.argtypes = (c_int, c_int)
lib.DemoCpp.restype = c_void_p
lib.DemoCppFunction.argtypes = (c_void_p,)
lib.DemoCppFunction.restype = None
(注意:這里我們可以不用第 1 行和第 4 行,因為 Python 會愉快地假設 integer 參數類型,並且我們的DemoCppFunction
不會返回任何東西,所以我們不會嘗試使用它的返回值。但是為了一致性,我們可以作為我們要明確。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.