【问题标题】:How to pass C++ classes as arguments when calling python functions from C++?从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?
【发布时间】:2014-12-07 23:33:02
【问题描述】:

我正在编写一个需要加载 Python 模块并调用该模块中的函数的 C++ 应用程序。 应用程序需要将 C++ 分类作为参数传递给 python 函数。 我设法从 C++ 代码中调用 python 代码,但我只设法将“原始”类型作为参数传递。

我使用 SWIG 创建包装器/接口,但我找不到如何将我的 C++ 类从应用程序转换为 PyObject* 以便将其作为参数传递给 python 函数。

您知道我在哪里可以找到有关如何执行从 C++ 转换为 PyObject* 的信息吗?

【问题讨论】:

    标签: python c++ swig


    【解决方案1】:

    Boost 有一个 Python 接口库,可能对你有帮助。

    check it out

    heres the documentation on functions

    【讨论】:

      【解决方案2】:

      我仍然没有解决方案,我只有以下解决方法: 1. 我从实例创建一个 PyObject,并将它传递给 python 函数。 2. python 代码,使用 SWIG 生成的库中的一个函数,将 PyObject 转换为该类的 python 版本。

      实现:

      在 C++ 文件中

      MyClass myObject;
      ...
      PyObject *parameterForPython = PyCObject_FromVoidPtr(&myObject, NULL); // step 1
      PyTuple_SetItem(pyArgs, 0, parameterForPython);
      PyObject_CallObject(pythonFunctionObject, pyArgs);
      

      在 swig 接口文件中(步骤 2 的代码):

      %inline %{
          MyClass *convertPyObjectToMyClass(PyObject * ptr) {
              return (MyClass *)PyCObject_AsVoidPtr(ptr)
          }
      %}
      

      在python模块中:

      def myPythonFunction(ptr):
          myObject = cppmodule.convertPyObjectToMyClass(ptr) #step 2
      

      【讨论】:

        【解决方案3】:

        您考虑过使用SWIG_NewPointerObj(ptr, type, flags)SWIG_ConvertPtr(obj, pptr, type, flags) 吗?

        您可以通过运行获得这些声明:

        swig -python -external-runtime swig-python.h
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-27
          • 2021-02-23
          • 1970-01-01
          • 2016-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多