1

私はまだこれに慣れていないので、いくつかの問題に直面しています。これが私のC++コードです。

#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:例外:アクセス違反の読み取り値0x000000000000000A

データを変換せずにPythonからC++に渡し、C++内で変換したいと思います。

4

2 に答える 2

3

コードに問題があることがいくつかあります。何よりもまず、適切なインクルードは次のとおりです。

#include <Python.h>

大文字に注意してくださいP。あなたはおそらくWindowsを使用していますが、これは大文字のPがないとLinuxでは機能しません。

また、*pSelf関数宣言にポインタのポイントが表示されないので、削除する必要があります。

PyObject *Add(PyObject *pArgs)

さて、あなたの主な問題はこれです:

MyDll.Add(1,2)

MyDll.Add...タプルで呼び出しません。2つの整数引数とで呼び出し1ます2。タプルを渡したい場合は、次のようにします。

MyDll.Add((1,2))

ただし、Pythonのctypeはこれをどう処理するかを認識しないため(通常は整数の引数を受け入れます)、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))
于 2013-02-27T18:41:41.450 に答える
3

拡張機能またはctypes;のいずれかを使用します。を介して内線番号を呼び出すことは想定されていませんctypes。拡張機能のポイントは、Pythonからそれらを使用している人々にネイティブに見えるモジュールを作成できるようにすることです。ctypesPythonを完全に知らずに書かれたCコードを呼び出すのに役立ちます。

于 2013-02-27T18:42:02.613 に答える