5

所以我使用 python 来调用共享 C++ 库中的方法。我在将 C++ 中的 double 返回到 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 的整数。这是怎么回事?

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

4

1 回答 1

6

来自ctypes 文档

默认情况下,假定函数返回 Cint类型。其他返回类型可以通过设置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

于 2013-06-16T22:08:24.040 回答