2013-06-16 4 views
5

그래서 파이썬을 사용하여 공유 C++ 라이브러리의 메소드를 호출합니다. C++에서 Python으로 double을 반환하는 데 문제가 있습니다. 문제를 보여주는 장난감 예제를 만들었습니다. 자유롭게 컴파일하고 사용해보십시오. 여기 파이썬에 C++ double을 반환 하시겠습니까?

# 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) : 여기서

파이썬 코드 (soexample.py)이다

#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입니다.

참조로 배열을 채우는 것도 궁금합니다. ctypes documentation에서

답변

6

:

기본 기능으로는 C int 형식을 반환 가정한다. 기타 함수 개체의 restype 특성을 설정하여 반환 형식을 지정할 수 있습니다. 아마이 간단한 경우에 작동하지만, 당신은 또한뿐만 아니라 CPPClass_py.restype를 지정해야합니다

import ctypes 

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

: 다음에 func_py의 사용을 변경하는 경우

그것은 작동합니다.

+0

정말 잘됐다! 'CPPClass_py.restype'를 지정하면 무엇을 의미합니까? – dillerj

+0

@dillerj 수출하는 또 다른 기능입니다. 그것은 restype 사양도 필요합니다. POINTER 및 구조를 확인하십시오. – zch

관련 문제