Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


devel:python

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
devel:python [2015/06/02 16:20] – [Qu'est ce que c'est?] zianedevel:python [2024/03/01 16:40] (current) – [Qu'est ce que c'est?] boman
Line 1: Line 1:
- 
 ====== Interface python ====== ====== Interface python ======
  
Line 16: Line 15:
     * [[http://www.python.org/|python.org]] : le site officiel     * [[http://www.python.org/|python.org]] : le site officiel
     * [[http://diveintopython.org/|dive into python]] : un bon tutorial     * [[http://diveintopython.org/|dive into python]] : un bon tutorial
-    * [[http://www.cetus-links.org/oo_python.html|cetus]] : un bon paquet de liens 
-    * [[http://starship.python.net/crew/hinsen/|Python and Science]] : un tutorial "scientifique" 
-    * [[http://www.effbot.org/zone/librarybook-index.htm|the standard library]] : une description de la lib standard en pdf 
  
 ===== Python vs l'interpreteur Oofelie (OE) ===== ===== Python vs l'interpreteur Oofelie (OE) =====
Line 39: Line 35:
 | Licence | payant (pas pour nous mais...) | gratuit - même encore mieux: on peut le revendre! (voir [[http://www.python.org/psf/license.html|licence python]]) |  | Licence | payant (pas pour nous mais...) | gratuit - même encore mieux: on peut le revendre! (voir [[http://www.python.org/psf/license.html|licence python]]) | 
  
-Ajoutons à ca des petits "plus" comme [[http://www.python.org/idle/|l'éditeur IDLE]] qui permet, avec son "path browser", de parcourir toutes les fonctions et les modules disponibles. L'interface Tk integrée à la distribution est aussi très intéressante.+Ajoutons à ca des petits "plus" comme [[http://www.python.org/idle/|l'éditeur IDLE]] qui permet, avec son "path browser", de parcourir toutes les fonctions et les modules disponibles. L'interface Tk intégrée à la distribution est aussi très intéressante.
  
-En fait, tout ce qui peut se faire avec l'interpréteur Oofelie peut se faire avec python. J'ai donc essayé de recréer un environement "Oofelie" sous python avec la contrainte d'une syntaxe similaire (ce n'est pas simple parce que l'interpréteur OE cache souvent bcp de choses à l'utilisateur - comme des conversions implicites).+En fait, tout ce qui peut se faire avec l'interpréteur Oofelie peut se faire avec Python. J'ai donc essayé de recréer un environnement "Oofelie" sous Python avec la contrainte d'une syntaxe similaire (ce n'est pas simple parce que l'interpréteur OE cache souvent beaucoup de choses à l'utilisateur - comme des conversions implicites).
  
-Une application très simple de la puissance de Python serait de programmer l'ouverture d'une fenêtre lors du chargement d'un jeu de données pour que l'utilisateur puisse entrer, charger/sauver ses paramètres et enfin pousser sur le bouton "start metafor". C'est fait en qq lignes sous python et ça permet de créer rapidement une application "métier". Il est même possible, dans ce cas, de ne distribuer que le fichier .pyc (version compilée et indépendante de la pateforme du ''.py'').+Une application très simple de la puissance de Python serait de programmer l'ouverture d'une fenêtre lors du chargement d'un jeu de données pour que l'utilisateur puisse entrer, charger/sauver ses paramètres et enfin pousser sur le bouton "start metafor". C'est fait en quelques lignes sous Python et ça permet de créer rapidement une application "métier". Il est même possible, dans ce cas, de ne distribuer que le fichier .pyc (version compilée et indépendante de la plateforme du ''.py'').
  
 {{ :doc:devel:metapython.jpg?200 |metapython.jpg}} {{ :doc:devel:metapython.jpg?200 |metapython.jpg}}
Line 49: Line 45:
 Parmi les nombreuses choses que nous avions demandé à OE et qui nous sont maintenant accessible, citons (dans le désordre) : Parmi les nombreuses choses que nous avions demandé à OE et qui nous sont maintenant accessible, citons (dans le désordre) :
  
-    * plus de memory leaks venant de l'interpreteur !!!+    * plus de memory leaks venant de l'interpréteur !!!
     * les "packages"     * les "packages"
     * arrêt de l'interpréteur lors d'erreur + callstack     * arrêt de l'interpréteur lors d'erreur + callstack
     * les strings, les vecteurs, les tuples, les dictionnaires, etc     * les strings, les vecteurs, les tuples, les dictionnaires, etc
-    * toutes les commandes sytèmes (ouvrir, fermer un fichier par exemple ; accès réseaux)+    * toutes les commandes systèmes (ouvrir, fermer un fichier par exemple ; accès réseaux)
     * le path browser     * le path browser
     * interface directe avec matlab via [[http://claymore.engineer.gvsu.edu/%7Esteriana/Python/pymat.html|pyMat]] et [[http://www.pfdubois.com/numpy/|NumPy]]     * interface directe avec matlab via [[http://claymore.engineer.gvsu.edu/%7Esteriana/Python/pymat.html|pyMat]] et [[http://www.pfdubois.com/numpy/|NumPy]]
     * interface directe avec GNUplot via [[http://gnuplot-py.sourceforge.net/|GnuPlot.py]]     * interface directe avec GNUplot via [[http://gnuplot-py.sourceforge.net/|GnuPlot.py]]
     * interface directe avec Qt via [[http://www.riverbankcomputing.co.uk/pyqt/|pyQt]], Fox via [[http://fxpy.sourceforge.net/|fXPy]], ...     * interface directe avec Qt via [[http://www.riverbankcomputing.co.uk/pyqt/|pyQt]], Fox via [[http://fxpy.sourceforge.net/|fXPy]], ...
-    * possibilité de s'interfacer avec n'importe quel language ou n'importe quelle autre librairie (même fortran si on est maso) - voir [[http://www.python.org/doc/essays/omg-darpa-mcc-position.html|glue it together with Python]]. +    * possibilité de s'interfacer avec n'importe quel langage ou n'importe quelle autre librairie (même Fortran si on est maso) - voir [[http://www.python.org/doc/essays/omg-darpa-mcc-position.html|glue it together with Python]]. 
-    * possibilité de distribuer des applications "métier" avec interface graphique intégrée (une interace graphique diférente par cas-test si on veut). +    * possibilité de distribuer des applications "métier" avec interface graphique intégrée (une interface graphique différente par cas-test si on veut). 
-    * plus de cast bidon lorsqu'on a de l'héritage multiple (expl: ''CurveDataFunct::castToFunct()'' est inutile!) +    * plus de cast bidon lorsqu'on a de l'héritage multiple (expl: ''CurveDataFunct::castToFunct()'' est inutile!). 
-    * gestion automatique des pointeurs ''NULL'' via l'objet ''PyNone'' (expl: ''curveSet(5)'' donne ''pyNone'' si la courbe numéro 5 n'existe pas)+    * gestion automatique des pointeurs ''NULL'' via l'objet ''PyNone'' (expl: ''curveSet(5)'' donne ''pyNone'' si la courbe numéro 5 n'existe pas).
     * ...     * ...
  
Line 79: Line 75:
  
  
-===== L'interface python de metafor =====+===== L'interface Python de Metafor =====
  
  
-Python possède une API écrite en C qui permet d'écrire des "modules" (comme les packages en java, ou namespaces en C++). Metafor est donc un module de Python.... enfin, presque. En effet, n'oublions pas que grâce au magnifique travail d'igor sur les matériaux et les éléments, il n'est pas possible d'initialiser correctement ceux-ci quand ils sont regroupés dans une lib. J'ai du donc choisir d'intégrer python dans l'exécutable metafor.+Python possède une API écrite en C qui permet d'écrire des "modules" (comme les packages en java, ou namespaces en C++). Metafor est donc un module de Python.... enfin, presque. En effet, n'oublions pas que grâce au magnifique travail d'Igor sur les matériaux et les éléments, il n'est pas possible d'initialiser correctement ceux-ci quand ils sont regroupés dans une lib. J'ai dû donc choisir d'intégrer Python dans l'exécutable Metafor.
  
-Cette interface n'est pas simple à écrire parce que l'API Python est complexe. J'etais donc un peu découragé jusqu'au jour où j'ai vu le logiciel [[http://www.swig.org/|Swig]] (Simplified Wrapper and Interface Generator) qui se charge du boulot. Mieux encore, Swig crée des "shadow classes" qui permettent d'obtenir des objets Python malgré l'API écrite en C. Swig gère aussi tous les problèmes de cast (ce qui pose beaucoup de problèmes dans l'interpréteur Oofelie).+Cette interface n'est pas simple à écrire parce que l'API Python est complexe. J'étais donc un peu découragé jusqu'au jour où j'ai vu le logiciel [[http://www.swig.org/|Swig]] (Simplified Wrapper and Interface Generator) qui se charge du boulot. Mieux encore, Swig crée des "shadow classes" qui permettent d'obtenir des objets Python malgré l'API écrite en C. Swig gère aussi tous les problèmes de cast (ce qui pose beaucoup de problèmes dans l'interpréteur Oofelie).
  
-Swig n'est pas qu'un simple traducteur: il gère également la surcharge des fonctions membres (absentes dans python puisque les types d'objets ne sont pas explicites) et l'héritage multiple. Tout ceci via un système de cast dynamique assez bien fait et relativement bien optimisé (j ai jeté un oeil, c'est largement mieux fait que OE). Enfin, Swig gère correctement les variables globales (qui, elles, ne sont pas des références python)+Swig n'est pas qu'un simple traducteur: il gère également la surcharge des fonctions membres (absentes dans Python puisque les types d'objets ne sont pas explicites) et l'héritage multiple. Tout ceci via un système de cast dynamique assez bien fait et relativement bien optimisé (j ai jeté un œil, c'est largement mieux fait que OE). Enfin, Swig gère correctement les variables globales (qui, elles, ne sont pas des références Python).
  
-L'interface Python de metafor se réduit donc à des fichiers input de Swig (fichiers ''.i'' et ''.swg''). Les fichiers ''.i'' donnent des ''.cpp'' via swig qui sont compilés un à un pour former des modules. Les fichiers ''.swg'' sont des fichiers inclus par les ''.i'' qui ne correspondent pas à un module. A l'heure actuelle, ces fichiers interfacent toutes les fonctions membres (publiques) des classes Metafor et Oofelie utilisées dans le célèbre cas-test "''cont2''".+L'interface Python de Metafor se réduit donc à des fichiers input de Swig (fichiers ''.i'' et ''.swg''). Les fichiers ''.i'' donnent des ''.cpp'' via Swig qui sont compilés un à un pour former des modules. Les fichiers ''.swg'' sont des fichiers inclus par les ''.i'' qui ne correspondent pas à un module. A l'heure actuelle, ces fichiers interfacent toutes les fonctions membres (publiques) des classes Metafor et Oofelie utilisées dans le célèbre cas-test "''cont2''".
  
-Lorsqu'on lance ''metafor'', on se retrouve en ligne de commande Python. Le module metafor est deja chargé en mémoire ainsi que le module utilitaire (''toolbox.utilities''). Il est donc possible de lancer un cas-test (''myTest.py'') par la simple commande:+Lorsqu'on lance ''Metafor'', on se retrouve en ligne de commande Python. Le module Metafor est déjà chargé en mémoire ainsi que le module utilitaire (''toolbox.utilities''). Il est donc possible de lancer un cas-test (''myTest.py'') par la simple commande:
  
     meta('myTest')     meta('myTest')
Line 104: Line 100:
  
  
-Avoir une première interface est très simple. Le premier problème était les cast implicites cachés derrière les ''get_properties()''. Heureusement, Swig peut gérer ça facilement (un peu comme le ''I_::new_child_from_id()'' de OE). J'ai du aussi gérer les ''std::string'' et les ''UserNo'' via des "''typemaps''" de Swig (un système qui permet de faire des casts implicites automatiques).+Avoir une première interface est très simple. Le premier problème était les cast implicites cachés derrière les ''get_properties()''. Heureusement, Swig peut gérer ça facilement (un peu comme le ''I_::new_child_from_id()'' de OE). J'ai dû aussi gérer les ''std::string'' et les ''UserNo'' via des "''typemaps''" de Swig (un système qui permet de faire des casts implicites automatiques).
  
 Après ceci, le premier résultat ne ressemblait pas trop à l'interpréteur Oofelie. Par exemple, les ''Lock''s étaient stockées dans une variable ''cvar''. Il fallait donc écrire: Après ceci, le premier résultat ne ressemblait pas trop à l'interpréteur Oofelie. Par exemple, les ''Lock''s étaient stockées dans une variable ''cvar''. Il fallait donc écrire:
Line 110: Line 106:
     loadingset.define(1,NODE_PO, Key(cvar.TX|cvar.GD|cvar.RE), 0, f)     loadingset.define(1,NODE_PO, Key(cvar.TX|cvar.GD|cvar.RE), 0, f)
  
-ce qui est lourd. J'ai donc réussi à "descendre" les variables cvar dans chaque namespace (et ceci de manière automatique - sans écrire). Bref, si on ajoute une ''Lock'', ca marche tout seul).+ce qui est lourd. J'ai donc réussi à "descendre" les variables cvar dans chaque namespace (et ceci de manière automatique - sans écrire). Bref, si on ajoute une ''Lock'', ça marche tout seul).
  
 Même remarque pour les noms d'éléments, de matériaux, de ''Elementproperties'', de ''MaterialProperties'', identificateurs, etc. Même remarque pour les noms d'éléments, de matériaux, de ''Elementproperties'', de ''MaterialProperties'', identificateurs, etc.
Line 121: Line 117:
     * Autre moyen: regarder ce que j'ai fait dans ''apps/qs/cont2.py''     * Autre moyen: regarder ce que j'ai fait dans ''apps/qs/cont2.py''
     * La syntaxe est extrêmement proche de celle d'Oofelie (ouf). Le passage des ''.e'' aux ''.py'' est presque immédiat.     * La syntaxe est extrêmement proche de celle d'Oofelie (ouf). Le passage des ''.e'' aux ''.py'' est presque immédiat.
-    * Je vous conseille aussi de jeter un oeil à Swig.+    * Je vous conseille aussi de jeter un œil à Swig.
     * Vous pouvez également regarder l'interface Z-Mesh.     * Vous pouvez également regarder l'interface Z-Mesh.
  
Line 128: Line 124:
     * charger un fichier : ''execfile('fichier.py')'' ou ''import fichier''     * charger un fichier : ''execfile('fichier.py')'' ou ''import fichier''
     * ''dir(module)'' : "''status''" de matlab     * ''dir(module)'' : "''status''" de matlab
-    * ''dir(variable)'' : donne les fcts membres+    * ''dir(variable)'' : donne les fonctions membres
     * ''PYTHONPATH'' : équivaut au ''LIBOOFE''     * ''PYTHONPATH'' : équivaut au ''LIBOOFE''
     * ''type(variable)'' : donne le type de variable     * ''type(variable)'' : donne le type de variable
     * ''print 'variable=', variable'' : imprime ''variable = valeur''     * ''print 'variable=', variable'' : imprime ''variable = valeur''
-    * tout est objet (même une fonction)+    * tout est objet (même une fonction).
  
 Différences par rapport à l'interpréteur OE: Différences par rapport à l'interpréteur OE:
devel/python.1433254858.txt.gz · Last modified: 2016/03/30 15:22 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki