2017-09-06 4 views
1

J'utilise rasade pour générer ma bibliothèque C, par exemple:rasade bibliothèque c et ctypes Uint8 type non valide

mylib.py et _mylib.pyd

int func(uint8_t* a) 
{ 
    return *a; 
} 

en python:

import mylib 
import ctypes 
a = (ctypes.c_uint8 * 8)() 
mylib.func(a) 

Mais en cours d'exécution Python me donne une erreur: TypeError: in method 'func', argument 1 of type 'uint8 *'

Je recherche les typemaps, et ajouter i t à mon fichier de module .i, comme ceci:

%module mylib 
%include "typemaps.i" 
extern int func(uint8_t* INPUT); 

erreur python à être.

J'imprime ctypes.c_uint8 et j'imprime mylib uint8, et j'ai trouvé que mylib uint8 est un objet swig. Comment faire ce travail?

+1

Les types de 'ctypes' ne sont pas compatibles avec' SWIG' comme vous essayez de les utiliser. Ils sont différents types. Je suggère d'inclure '% include" carrays.i "et% array_class (unsigner char, uint8ArrayClass)' dans votre fichier d'interface 'SWIG' et d'utiliser le' uint8ArrayClass (4) 'généré pour générer un tableau C enveloppé pour l'entrée par exemple. un tableau de longueur 4. –

+0

Salut merci, pourriez-vous me montrer un texte simple? –

+0

Regardez dans le manuel swig rechercher les mots-clés que j'ai fournis –

Répondre

1

Je pense que cela est décrit en détail dans la documentation, mais voilà

test.h

#pragma once 
#include <cstdlib> 
#include <cstdint> 
int func(uint8_t* a, const size_t len); 

test.cpp

#include "test.h" 

#include <iostream> 

int func(uint8_t* a, const size_t len) { 
    int result = 0; 
    for (size_t i = 0 ; i < len ; i++) { 
    result += int(a[i]); 
    } 
    return result; 
} 

test.i

%module example 
%{ 
    #include "test.h" 
%} 

%include "carrays.i" 
%include "stdint.i" 
%array_functions(uint8_t, uint8Array); 

%include "test.h" 

setup.py

from distutils.core import setup, Extension 

setup(name="example", 
     py_modules=['example'], 
     ext_modules=[Extension("_example", 
        ["test.i","test.cpp"], 
        swig_opts=['-c++'], 
    extra_compile_args=['--std=c++11'] 
       )] 

) 

construire en utilisant python setup.py build_ext --inplace et test à l'aide

import example 
g = example.new_uint8Array(3) 
example.func(g,3)