IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

Extension python en c avec swig sous win32


Sujet :

Interfaçage autre langage Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Extension python en c avec swig sous win32
    Bonjour,
    je veux faire une extension python en c .
    Je commence par en faire une simple pour assimiler la méthode de compilation .
    Donc je fait un fichier mon_module.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void ma_fonction(void) {
    printf("essai") ;
     
     
    }
    et module.i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    %module mon_module
    %{
    #include <stdio.h>
    #include <stdlib.h>
    %}
     
    void ma_fonction(void);
    ensuite je tape dans la console : swig -python module.i sa me donne un script python mon_module.py et un script c module_wrap assez volumineux (92 ko).
    Bref ensuite je fait un script de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from distutils.core import setup, Extension
     
    MOD = 'Extest'
    setup(name=MOD, ext_modules=[
    	Extension(MOD, sources=['module_wrap.c'])])
    Bon je tape setup.py build
    ha sa me dit que visual 2003 n'est pas installé et que l'ont peux utiliser mingw32 bon je tape setupt.py build -c mingw32

    et la la compilation demarre et voila ce qui s'affiche



    Si vous pourriez m'aider S.V.P..
    Merci d'avance !

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    Moi, je lance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -c mon_module.c module_wrap.c -Ic:\python26\include
    et j'ai deux fichiers .o
    (j'ai suivi votre procédure pour créer les 2 fichiers .c)
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    - Une fois ton module s'appelle "mon_module", une fois il s'appelle "Extest".
    - Ton extension (compilée à partir du code C) et ton module (fichier .py) portent le même nom
    - Tu ne donnes pas ton fichier .c au compilateur
    - Tu ne copies pas le wrapper python

    Ton setup.py corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from distutils.core import setup, Extension
     
    MOD = 'mon_module'
     
    ext_mod = Extension("_" + MOD, sources=['module_wrap.c', 'module.c'])
     
    setup(name=MOD, ext_modules=[ext_mod], py_modules=[MOD])
    http://www.swig.org/Doc1.3/Python.html#Python_nn6

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Alors déjà merci de m'avoir aider .
    Bon j'obtient un fichier _mon_module.pyd et un fichier mon_module.py
    je copie le fichier _mon_module_pyd dans le dossier lib/site-packages du dossier python (note : j'ai la version 2.5).
    Je lance la console python je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from mon_module import ma_fonction
    pas d'erreur ensuite je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_module.ma_fonction()
    et il se passe rien ...

    EDIT : cela bug sous idle mais sous la ligne de commande python cela marche !

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    mon_module.ma_fonction()
    essai juste

    si tu veux taper mon_module.ma_fonction()

    Tu dois utiliser

    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Citation Envoyé par liomec Voir le message
    EDIT : cela bug sous idle mais sous la ligne de commande python cela marche !
    Normal, printf écrit sur la sortie standard, IDLE redirige sys.stdout mais n'a aucune influence sur printf, si tu lançais IDLE à travers un terminal, tu verrais ton texte s'y afficher.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Essaie avec ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void ma_fonction(void) {
      fprintf(stdout, "essai") ;
    }

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Citation Envoyé par tamiel Voir le message
    Essaie avec ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void ma_fonction(void) {
      fprintf(stdout, "essai") ;
    }
    Ne fonctionne pas non plus, comme dit, IDLE redirige sys.stdout (environnement python), et pas stdout (environnement C). Si on lance IDLE par un terminal, ça s'affiche dans le terminal.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LibreOffice] Utiliser python 2.7 avec LibreOffice 4.3.4.1 sous Ubuntu 14.04
    Par jurassic pork dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 06/12/2014, 17h03
  2. Python : gestion des touches avec pygame sous Raspberry
    Par bypbop dans le forum Général Python
    Réponses: 5
    Dernier message: 18/11/2014, 19h11
  3. Portage Linux->Windows module python généré avec SWIG
    Par GeoPy dans le forum Déploiement/Installation
    Réponses: 0
    Dernier message: 13/05/2011, 16h02
  4. Transformer structure (argument de fonction) de C++ vers Python avec swig
    Par developers dans le forum Interfaçage autre langage
    Réponses: 0
    Dernier message: 20/07/2010, 11h44
  5. Swig - Python/C++ problème avec STL
    Par mencaglia dans le forum Interfaçage autre langage
    Réponses: 2
    Dernier message: 26/11/2007, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo