2013-06-16 38 views
5

Vì vậy, tôi đang sử dụng python để gọi các phương thức trong một thư viện C++ dùng chung. Tôi đang gặp một vấn đề trả lại một đôi từ C + + để python. Tôi đã tạo ra một ví dụ đồ chơi thể hiện vấn đề. Vui lòng biên dịch và dùng thử.Trả lại C++ gấp đôi cho Python?

Đây là mã python (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 

Đây là 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 với:

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

Khi Tôi chạy được:

$ python soexample.py 
x = 0 

Vì vậy, kết quả là một số nguyên theo loại và giá trị 0. Điều gì đang xảy ra?

Tôi cũng tò mò về việc điền mảng bằng tham chiếu.

Trả lời

6

Từ ctypes documentation:

Bởi chức năng mặc định được giả định để trả lại loại C int. Các loại trả về khác có thể được chỉ định bằng cách đặt thuộc tính restype của đối tượng hàm .

Nó hoạt động nếu bạn thay đổi việc bạn sử dụng func_py như sau:

import ctypes 

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

Trong khi nó có thể sẽ làm việc cho trường hợp đơn giản này, bạn cũng nên xác định CPPClass_py.restype là tốt.

+0

Điều đó hiệu quả! Ý bạn là gì bằng cách chỉ định 'CPPClass_py.restype'? – dillerj

+0

@dillerj là một chức năng khác mà bạn xuất. Nó cũng cần đặc điểm kỹ thuật restype. Kiểm tra POINTER và cấu trúc. – zch

Các vấn đề liên quan