2013-02-27 42 views
1

正如我還是新來這個,我面臨的一些問題,這是我的C++代碼:蟒蛇與C++使用ctypes的

#include <python.h> 

#define DLLEXPORT extern "C" __declspec(dllexport) 

DLLEXPORT PyObject *Add(PyObject *pSelf, PyObject *pArgs) 
{ 
    int s,d; 
    if(!PyArg_ParseTuple(pArgs, "ii" , &s, &d)) 
    { 
     PyErr_SetString(PyExc_TypeError, 
       "Add() invalid parameter"); 
     return NULL; 
    } 

    return Py_BuildValue("i", s + d); 

} 

而Python代碼:

import ctypes 

MyDll = ctypes.cdll.LoadLibrary(r"PyToCppTest.dll") 

jj = MyDll.Add(1,2) 

我得到一個錯誤,當我運行上面Python代碼:

OSError: exception: access violation reading 0x000000000000000A

我想通過數據,而不將其轉換,從Python來C++,然後將其轉換裏面C++。

回答

3

您的代碼有幾個錯誤。首先,正確的包括:

#include <Python.h> 

請注意首都P。你可能在Windows上,但是如果沒有大寫字母P,這在Linux上將不起作用。另外,我沒有在你的函數聲明中看到*pSelf指針的位置,你應該去掉它:

PyObject *Add(PyObject *pArgs) 

現在,你的主要問題是:

MyDll.Add(1,2) 

...不叫MyDll.Add一個元組。它用兩個整數參數12來調用它。如果你想傳遞一個元組,你會怎麼做:

MyDll.Add((1,2)) 

然而,Python的ctypes的會不知道該怎麼做這(它通常接受整數參數),所以你需要告訴它Add實際上想要一個元組,並返回一個Python對象:

import ctypes 

MyDll = ctypes.cdll.LoadLibrary("PyToCppTest.dll") 
MyCFunc = ctypes.PYFUNCTYPE(
    ctypes.py_object,  # return val: a python object 
    ctypes.py_object  # argument 1: a tuple 
) 
MyFunc = MyCFunc(('Add', MyDll)) 

jj = MyFunc((1,2)) 
+0

哇,你真棒:d 它的工作就像一個魅力:) 只是需要更多的解釋:爲何要移除*,因爲我已經看到它在所有在線功能 ,不明白MyCFunc部分(pSelf「添加「,MyDll) – 2013-02-28 03:27:01

+1

@MohamedSakrAboYoucuf:因爲'Add'實際上並不是一個類實例的成員,而是一個靜態函數。 'self'只能由解釋器自動傳遞,作爲* methods *的第一個參數,而不是* functions *。 – netcoder 2013-02-28 14:00:32

+0

最後一件事,有沒有辦法提取C++內的對象方法? – 2013-02-28 15:22:30

3

使用一個分機或​​;你不應該通過​​致電你的分機。擴展的要點是能夠創建模塊,這些模塊對於使用Python的人來說是本機的。​​用來調用完全不知道Python的C代碼。