簡體   English   中英

無法在 Python 中撥打 C++ class function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM