返回c++双精度给Python

Return C++ double to Python?

本文关键字:Python 双精度 c++ 返回      更新时间:2023-10-16

所以我使用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

下面是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;    
    }
}
编译:

g++ -fPIC -Wall -Wextra -shared -o libsoexample.so soexample.cpp

当我运行时,我得到:

$ python soexample.py
x = 0

所以结果是一个值为0的类型整数。这是怎么呢

我也很好奇通过引用填充数组

From ctypes documentation:

默认情况下,假设函数返回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

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