【问题标题】:python with c++ using ctypespython 与 c++ 使用 ctypes
【发布时间】:2013-02-13 15:23:18
【问题描述】:

由于我还是新手,我遇到了一些问题,这是我的 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++ 中转换。

【问题讨论】:

    标签: c++ python c ctypes


    【解决方案1】:

    使用扩展名或ctypes;您不应该通过ctypes 呼叫您的分机。扩展的重点是能够创建对使用 Python 的人来说是原生的模块。 ctypes 用于调用完全没有使用 Python 编写的 C 代码。

    【讨论】:

      【解决方案2】:

      您的代码存在一些问题。首先,正确的包含是:

      #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))
      

      【讨论】:

      • 哇,你太棒了 :D 它就像一个魅力 :) 只需要更多解释:为什么删除 *pSelf,因为我已经在所有在线功能上看到它并且不理解 MyCFunc 部分( "添加",MyDll)
      • @MohamedSakrAboYoucuf:因为Add 实际上不是类实例的成员,而是静态函数。 self 仅由解释器自动作为第一个参数传递给 methods,而不是 functions
      • 最后一件事,有没有办法在c++中提取对象方法?
      • @netcoder 是语句“return NULL;”正确的?它不应该返回 Py_None 之类的吗?
      • @Czarek 我认为是(python 中的 int != c ++ 中的 int),这意味着例如(python 中的 5 != c ++ 中的 5)由于每种语言的基础设施,但所有语言中的 0是 0(它的二进制代码是简单的 0 :D)
      猜你喜欢
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多