Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return C++ double to Python?

So I am using python to call methods in a shared C++ library. I am having an issue returning a double from the C++ to the python. I have a created a toy example that exhibits the problem. Feel free to compile and try it out.

Here is the python code (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

Here is the 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;    
    }
}

Compile with:

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

When I run I get:

$ python soexample.py
x = 0

So the result is an integer in type and of value 0. What's going on?

I'm also curious about filling arrays by reference.

like image 785
dillerj Avatar asked Jun 16 '13 21:06

dillerj


1 Answers

From ctypes documentation:

By default functions are assumed to return the C int type. Other return types can be specified by setting the restype attribute of the function object.

It works if you change your use of func_py to the following:

import ctypes

func_py = cpplib.func_py
func_py.restype = ctypes.c_double
x = func_py(cppobj)
print 'x =', x

While it will probably work for this simple case, you should also specify CPPClass_py.restype as well.

like image 138
zch Avatar answered Sep 24 '22 06:09

zch