Revert C ++ to dual Python?

Therefore, I use python to call methods in the C ++ shared library. I have a problem with returning a double from C ++ in python. I have a toy example that shows a 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 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 the type and a value of 0. What happens?

I am also interested in learning about filling arrays by reference.

+5
source share
1 answer

From the ctypes documentation :

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

It works if you change the 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 

Although this will probably work for this simple case, you should also specify CPPClass_py.restype .

+6
source

Source: https://habr.com/ru/post/947271/


All Articles