2013-06-16 29 views
5

Używam python do wywoływania metod w udostępnionej bibliotece C++. Mam problem zwracający podwójne z C++ do Pythona. Mam stworzony zabawkowy przykład, który pokazuje problem. Możesz go skompilować i wypróbować.Powrót C++ do Pythona?

Oto kod pyton (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 

Oto 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;  
    } 
} 

podczas kompilacji:

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

Kiedy Uruchamiam Otrzymuję:

$ python soexample.py 
x = 0 

Wynik jest liczbą całkowitą w typie i wartością 0. Co się dzieje?

Jestem także ciekawa wypełniania tablic przez odniesienie.

Odpowiedz

6

Od ctypes documentation:

przez funkcje domyślne zakłada powrót typ C int. Inne typy zwracanych wartości można określić, ustawiając atrybut restype obiektu funkcji .

To działa, jeśli zmienisz wykorzystanie func_py na następujące kwestie:

import ctypes 

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

Chociaż to prawdopodobnie będzie pracować dla tej prostej sprawy, należy również określić CPPClass_py.restype również.

+0

To zadziałało świetnie! Co masz na myśli podając 'CPPClass_py.restype'? – dillerj

+0

@dillerj to inna funkcja, którą eksportujesz. Wymaga także zmiany specyfikacji. Sprawdź POINTER i strukturę. – zch