将C++双重返回Python?

dil*_*erj 5 c++ python double ctypes shared-libraries

所以我使用python来调用共享C++库中的方法.我有一个问题,从C++返回到Python的双重问题.我有一个创建了一个展示问题的玩具示例.随意编译并试用.

这是python代码(soexample.py):

# Python imports
from ctypes import CDLL
import numpy as np

# Open shared CPP library:
cpplib=CDLL('./libsoexample.so')
cppobj = cpplib.CPPClass_py()

# Stuck on converting to short**?
x = cpplib.func_py(cppobj)
print 'x =', x
Run Code Online (Sandbox Code Playgroud)

这是C++(soexample.cpp):

#include <iostream>

using namespace std;

class CPPClass
{
  public:
  CPPClass(){}

  void func(double& x)
  {
    x = 1.0;
  }
};

// For use with python:
extern "C" {
    CPPClass* CPPClass_py(){ return new CPPClass(); }
    double func_py(CPPClass* myClass)
    {      
      double x;  
      myClass->func(x);
      return x;    
    }
}
Run Code Online (Sandbox Code Playgroud)

编译:

g++ -fPIC -Wall -Wextra -shared -o libsoexample.so soexample.cpp
Run Code Online (Sandbox Code Playgroud)

当我跑步时,我得到:

$ python soexample.py
x = 0
Run Code Online (Sandbox Code Playgroud)

所以结果是类型和值为0的整数.发生了什么?

我也对通过引用填充数组感到好奇.

zch*_*zch 6

来自ctypes文档:

默认情况下,假定函数返回C int类型.可以通过设置restype函数对象的属性来指定其他返回类型.

如果您将使用更改func_py为以下内容,则此方法有效:

import ctypes

func_py = cpplib.func_py
func_py.restype = ctypes.c_double
x = func_py(cppobj)
print 'x =', x
Run Code Online (Sandbox Code Playgroud)

虽然它可能适用于这个简单的情况,但您也应该指定CPPClass_py.restype.