2013-06-16 19 views
5

Paylaşılan bir C++ kitaplığında yöntemleri çağırmak için python kullanıyorum. C++ 'dan python'a bir çift döndüren bir sorun yaşıyorum. Sorunu gösteren bir oyuncak örneği oluşturdum. Derlemek ve denemek için çekinmeyin. Burada C++ ile Python'a geri dönün mü?

# 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): Burada

piton kodu (soexample.py) olan

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

Derleme ile:

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

Ben koşuyorum koşuyorum:

$ python soexample.py 
x = 0 

Sonuç, tür ve değer 0'da bir tamsayıdır. Neler oluyor?

Ayrıca referans ile doldurma dizilerini merak ediyorum. ctypes documentation itibaren

cevap

6

:

varsayılan işlevlere göre C int türü dönmek varsayılır. Diğer dönüş türleri, işlev nesnesinin restype özniteliği ayarlanarak belirtilebilir. muhtemelen bu basit durum için çalışacak yaparken, aynı zamanda CPPClass_py.restype belirtmelidir

import ctypes 

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

: aşağıdakilere func_py kullanımınızı değiştirirseniz

Çalışıyor.

+0

Bu harika çalıştı! "CPPClass_py.restype" ifadesini kullanarak ne demek istiyorsunuz? – dillerj

+0

@ dillerj, dışa aktardığınız başka bir işlevdir. Restype spesifikasyonuna da ihtiyaç duyar. POINTER ve Yapısını kontrol et. – zch

İlgili konular