Comment faire communiquer C, Python, R?



Documents pareils
1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Le prototype de la fonction main()

Introduction au langage C

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Programmation système I Les entrées/sorties

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Java Licence Professionnelle CISII,

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Une introduction à Java

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Package Java.util Classe générique

Utilisation d objets : String et ArrayList

Derrière toi Une machine virtuelle!

Cours Programmation Système

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Compression de Données - Algorithme de Huffman Document de Conception

Algorithmique et Programmation, IMA

Généralités sur le Langage Java et éléments syntaxiques.

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TD3: tableaux avancées, première classe et chaînes

Les chaînes de caractères

PROGRAMMATION PAR OBJETS

Projet de programmation (IK3) : TP n 1 Correction

OS Réseaux et Programmation Système - C5

Le langage C. Séance n 4

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Les processus légers : threads. Système L3, /31

Programmation système de commandes en C

Chapitre 1 : La gestion dynamique de la mémoire

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Cours Langage C/C++ Programmation modulaire

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

3IS - Système d'exploitation linux - Programmation système

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Programmer en JAVA. par Tama

Cours 6 : Tubes anonymes et nommés

Programmation en langage C

INITIATION A LA PROGRAMMATION

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Programme Compte bancaire (code)

UE Programmation Impérative Licence 2ème Année

Manuel d'installation

I. Introduction aux fonctions : les fonctions standards

Chap III : Les tableaux

TP1 : Initiation à Java et Eclipse

Lier Erlang avec d autres langages de programmation

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Tp 1 correction. Structures de données (IF2)

Cours Java Native Interface

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Quelques éléments de compilation en C et makefiles

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Rappels Entrées -Sorties

Gestion de la mémoire

Initiation à JAVA et à la programmation objet.

Claude Delannoy. 3 e édition C++

TP : Gestion d une image au format PGM

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Programmation par les Objets en Java

INF 104 (SELC) Introduction au langage C

Algorithmique, Structures de données et langage C

BTS IRIS Cours et Travaux Pratiques. Programmation C. A. Lebret, TSIRIS, Lycée Diderot, 1995/06. en conformité avec le référentiel du BTS IRIS

Conventions d écriture et outils de mise au point

Cours de programmation avancée. Le langage C. Université du Luxembourg

Table des matières. Chapitre 4 : Variables pointeurs

INFO-F-404 : Techniques avancées de systèmes d exploitation

Initiation. àl algorithmique et à la programmation. en C

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Programmation C. J.-F. Lalande. 15 novembre 2012

Corrigé des exercices sur les références

Plan du cours. Historique du langage Nouveautés de Java 7

Chapitre 10. Les interfaces Comparable et Comparator 1

TP 1. Prise en main du langage Python

UE C avancé cours 1: introduction et révisions

Java DataBaseConnectivity

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Cours de C/C++ par la pratique. Hugues Talbot

Les structures. Chapitre 3

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Cours d initiation à la programmation en C++ Johann Cuenin

Cours 1: Java et les objets

Arguments d un programme

SUPPORT DE COURS. Langage C

Notes de Cours - Programmation Pascal Ferraro

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Présentation du langage et premières fonctions

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Outils pour la pratique

Introduction à JDBC. Accès aux bases de données en Java

Transcription:

Programmation Avançée Comment faire communiquer C, Python, R? Objectif : - Interfacer des programmes écrits dans différents langages Application : - Importer une librairie partagée C dans R - Importer une librairie partagée C dans Python Le 29/09/05 Debret Gaëlle / Maupetit Julien M2BI

Plan I. Interface C / R : 1. Lancer une librairie dynamique sous R 2. Passer des arguments 3. Modifier des valeurs 4. Interfaçage pour un tableau 2D 5. Fonctions d'interfaçage sous R II. Swig 1. Généralités 2. Application, interface C / Python 29/09/05 Interface C/R/Python 2

Plan I. Interface C / R : 1. Lancer une librairie dynamique sous R 2. Passer des arguments 3. Modifier des valeurs 4. Interfaçage pour un tableau 2D 5. Fonctions d'interfaçage sous R II. Swig 1. Généralités 2. Application, interface C / Python 29/09/05 Interface C/R/Python 3

Chargement d'une librairie C dans R Rien de tel qu'un exemple pour comprendre : $> cat fic.c #include <stdio.h> void hello (){ printf("test reussi\n"); $> gcc c fic.c $> gcc shared fic.o o libmbi.so $> R > dyn.load("libmbi.so") > is.loaded("coucou") [1] FALSE > is.loaded("hello") [2] TRUE >.C("hello") Test reussi > Attention aux subtilités : La fonction appelée par.c dans R ne doit pas retourner de valeur Lorsque l'on fait appel à une fonction par.c les objets passés en argument sont copiés!!! De même après l'appel, les objets sont à nouveau copiés pour être mis dans une liste 29/09/05 Interface C/R/Python 4

Passage d'arguments Les objets passés en arguments sont considérés comme des pointeurs dans la fonction C Comme les objets sont copiés lors de l'appel via.c, c'est l'adresse de la copie qui est transmise à la fonction $> cat fic.c #include <stdio.h> void test (int *a){ printf("test reussi: %d!\n",*a); $> gcc c fic.c $> gcc shared fic.o o libmbi.so $> R > dyn.load("libmbi.so") > a = 54 >.C("test",as.integer(a)) Test reussi : 54! [[1]] [1] 54 29/09/05 Interface C/R/Python 5

Modification d'une valeur $> cat fic.c #include <stdio.h> void mod (int *a){ printf("avant: %d! ",*a); *a = 99; printf("apres: %d!\n",*a); $> gcc c fic.c $> gcc shared fic.o o libmbi.so $> R > dyn.load("libmbi.so") > a = 54 >.C("modif",as.integer(a)) Avant : 54! Apres : 99! [[1]] [1] 99 > a [1] 54 Bien modifié dans le C Liste retournée modifiée a NON modifié 29/09/05 Interface C/R/Python 6

Modification d'une valeur : Solution $> cat fic.c #include <stdio.h> void mod (int *a){ $> gcc c fic.c printf("avant: %d! ",*a); *a = 99; printf("apres: %d!\n",*a); $> gcc shared fic.o o libmbi.so $> R > dyn.load("libmbi.so") > a = 54 > a =.C("modif",z = as.integer(a))$z Avant : 54! Apres : 99! > a [1] 99 Une valeur est retournée dans a Laquelle? L'élément z de la liste 29/09/05 Interface C/R/Python 7

Passage d'un vecteur Les arguments sont considérés comme des pointeurs dans la fonction C En C les tableaux ne sont que des pointeurs $> cat fic.c #include <stdio.h> void testvec (double *v, int *a){ int i; for (i = 0; i < *a; i++){ printf("v[%d] : %lf\n", i, v[i]); v[i] += 10; $> R > dyn.load("libmbi.so") > v = seq(1,4,1) >.C("testvec",as.double(v), as.integer(length(v))) v[0] 1.000000 v[1] 2.000000 v[2] 3.000000 v[3] 4.000000 [[1]] [1] 11 12 13 14 29/09/05 Interface C/R/Python 8

Passage d'une chaine de caractères En R, les chaines de caractères sont codés comme des tableaux de chaines Ce sont donc des char ** $> cat fic.c #include <stdio.h> void testchar (char **s, int *a){ int i; for (i = 0; i < *a; i++){ printf("s[%d] : %s\n", i, s[i]); v[i] += 10; $> R > dyn.load("libmbi.so") > s = "Bonjour!!!" >.C("testchar",as.character(s), as.integer(1)) s[0] : Bonjour!!! [[1]] [1] "Bonjour!!!" [[2]] [1] 1 29/09/05 Interface C/R/Python 9

Interfacage d'une matrice Sous R : [,1] [,2] [1,] 11 12 [2,] 21 22 [3,] 31 32 En mémoire : 1 tableau par colonnes 11 21 31 12 22 32 Sous C : 11 12 21 22 31 32 En mémoire : 1 tableau de tableaux par lignes Besoin d'un programme d'interfacage qui convertit les matrices!!! Matrice = pointeur simple (comme les vecteurs)!!! 29/09/05 Interface C/R/Python 10

Interfacage d'une matrice : Solution $> cat fic.c void tabint_r (int *m, int *nl, int *nc){ int i; int **m2 = (int **) calloc (*nl, sizeof (int*)); for (i = 0; i < *nl; i++){ m2[i] = &m[i * (*nc)]; tabint (m2, *nl, *nc); /* traitement de la matrice */... $> R > dyn.load("libmbi.so") > m = matrix(seq(1,9),3,3) > m =.C("tabint_R",as.integer(m),as.integer(3), as.integer(3)) > m [1] 1 2 3 4 5 6 7 8 9 > matrix(m,3,3) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 29/09/05 Interface C/R/Python 11

Fonctions d'interfacage sous R Il y a quelques subtilités pour interfacer C et R : Variables simples pointeurs Vecteurs, matrices pointeurs Chaines de caractères pointeurs de pointeurs Copie des variables, pas de retour de fonction, etc Pas question de modifier les fonctions écrites en C : Utilisation de la librairie pour des programmes C Création de fonctions d'interfacage qui adaptent les types donnés et appellent les "vraies" fonctions C Convention : mafonction_r Introduites dans le même fichier.c que la "vraie" fonction 29/09/05 Interface C/R/Python 12

Plan I. Interface C / R : 1. Lancer une librairie dynamique sous R 2. Passer des arguments 3. Modifier des valeurs 4. Interfaçage pour un tableau 2D 5. Fonctions d'interfaçage sous R II. Swig 1. Généralités 2. Application, interface C / Python 29/09/05 Interface C/R/Python 13

SWIG (Simplified Wrapper and Interface Generator) Wrapper = emballage Permet d'interfacer des langages de script avec du C, C++ (perl, python, tcl ) Fonctions C Fonctions interfaçage SWIG Philosophie générale: Librairie C /* From Python To C */ long PyInt_AsLong(PyObject * obj ); Module /* From C To Python */ PyObject *PyInt_FromLong(long x); Python, Perl, Tcl 29/09/05 Interface C/R/Python 14

Entrées / Sorties de SWIG #include <stdio.h> void hello( void ) { printf("test reussi!\n"); hello.c %module libagm2 %{ /* Put headers and other declarations here */ % extern void hello( void ); hello.i [ ] static PyObject *_wrap_hello(pyobject *self, PyObject *args) { PyObject *resultobj; if(!pyarg_parsetuple(args,(char *)":hello")) goto fail; hello(); [ ] Py_INCREF(Py_None); resultobj = Py_None; return resultobj; fail: return NULL; hello_wrap.c 29/09/05 Interface C/R/Python 15

Howto > ls README.Exemple1 hello.c hello.i > swig -python hello.i > ls README.Exemple1 hello.c hello.i hello_wrap.c libagm2.py > > gcc -c hello.c hello_wrap.c - I/usr/include/python2.4 > > ld -shared hello.o hello_wrap.o -o _libagm2.so > > python [blah blah blah] >>> import libagm2 >>> libagm2.hello() Test reussi! >>> 1. swig -langage [fichier.i] NB: si python a été choisi, le module python est créé à cette étape (libagm2.py). 2. compilation des objets avec les headers python 3. création de la librairie partagée (.so) 4. Importation du module sous python Le module python fait la correspondance entre le.py et la librairie partagée.so 29/09/05 Interface C/R/Python 16

Passage d'arguments (I) #include <stdio.h> #include <stdlib.h> int test(int n) { printf("=> n = %d\n", n); void add( double x, double y, double *sum ) { *sum = x + y; %module libagm2 %{ /* Put headers and other declarations here */ % extern int test(int n); extern void add( double x, double y, double *sum ); extern double add2( double x, double y ); exemple.i double add2( double x, double y ) { return x+y; exemple.c 29/09/05 Interface C/R/Python 17

Passage d'arguments (II) exemple_wrap.c [ ] static PyObject *_wrap_add(pyobject *self, PyObject *args) { PyObject *resultobj; double arg1 ; double arg2 ; double *arg3 = (double *) 0 ; PyObject * obj2 = 0 ; if(!pyarg_parsetuple(args,(char *)"ddo:add",&arg1,&arg2,&obj2)) goto fail; if ((SWIG_ConvertPtr(obj2,(void **) &arg3, SWIGTYPE_p_double,SWIG_POINTER_EXCEPTION 0 )) == -1) SWIG_fail; add(arg1,arg2,arg3); [ ] Py_INCREF(Py_None); resultobj = Py_None; return resultobj; fail: return NULL; 29/09/05 Interface C/R/Python 18

Passage d'arguments (III) exemple_wrap.c [ ] static PyObject *_wrap_add2(pyobject *self, PyObject *args) { PyObject *resultobj; double arg1 ; double arg2 ; double result; if(!pyarg_parsetuple(args,(char *)"dd:add2",&arg1,&arg2)) goto fail; result = (double)add2(arg1,arg2); [ ] resultobj = PyFloat_FromDouble(result); return resultobj; fail: return NULL; 29/09/05 Interface C/R/Python 19

Bah alors A vous de jouer bon courage! et n'oubliez pas: http://swig.sourceforge.net/ 29/09/05 Interface C/R/Python 20