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

Python Discussion :

Restriction d'execution de code


Sujet :

Python

  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut Restriction d'execution de code
    Bonsoir tout le monde et joyeuse année 2009, avec plein de bonheur et de sureté ....

    J'ai une question à laquelle je n'ai pue avoir de réponse jusque là.
    Je développe une application en Java, et pour avoir un système de plugins j'y embarque JYthon (www.jython.org). Maintenant, je pose la question dans le thread Python car si j'ai une réponse ici je trouverai sûrement pour JYthon.

    Comme vous devriez déjà le savoir, un plugin a par définition deux fonctions principales qui sont exécutées par le plugins loader:
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def plugin_init():
              # Initialisation du plugin
     
    def plugin_clean():
              # destruction du pluhgin
     
    #d'autre fonctions appelées dans les deux fonctions au dessus
    def another_one():
             #....
    #...etc
    Maintenant la question est: Si on met du code en dehors d'une déclaration de fonctions genre tout à la fin, eh ben ce code sera exécuté au chargement ce qui, à mon sens, viol le concept de module, c'est comme si on avait une classe avec des initialisations statiques.
    Est-ce qu'en python, il existe une "magouille" (si j'ose dire) qui permet de restreindre l'exécution de code de telle sorte qu'on puisse uniquement "charger" le script (donc construire la table des références) sans pour autant exécuter au sens propre le code qui s'y trouve ?

    Merci
    Compil your life guy!
    The Aures Project

  2. #2
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Tu peux regarder autour du package compiler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from compiler import parseFile
    print parseFile('mon_fichier.py')
    Cela te permets de charger un fichier sans pour autant l'exécuter et de plus analyser son contenu.

    Avec le fichier 'mon_fichier.py' suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class myclass():
        def test(self):
            print 'test in myclass'
     
    def myfunc():
        print 'coucou'
     
    print 'test3'
    tu obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Module(None, Stmt([Class('myclass', [], None, Stmt([Function(None, 'test', ['self'], [], 0, None, Stmt([Printnl([Const('test in myclass')], None)]))])), Function(None, 'myfunc', (), (), 0, None,Stmt([Printnl([Const('coucou')], None)])), Printnl([Const('test3')], None)]))
    A toi de faire la recherche de la signature dont tu as besoin.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Au lieu de seulement parser le code, on peut aller plus loin et déjà le compiler. On peut ensuite "naviguer" dans l'objet code pour exécuter uniquement les définitions de classes (et/ou de fonctions). Mais franchement, cela complique pas mal les choses et je ne vois pas en quoi cela viole le concept de module. Tu compares cela à une initialisation statique mais même Java permet des initialisations statiques. Est-ce que cela viole le concept de module en Java ? Selon quels critères ?

  4. #4
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    @DelphiManiac:
    Merci pour ta solution. Et je vais voir si je peux faire pareil dans Jython

    @dividee: Je parlais d'initiateurs statiques juste pour comparer, je ne disais pas que c'était illogique comme concept. Mais par contre pour mes plugins, je veux qu'ils soient tous du même format et donc forcer la dessus pour pas qu'on crée des plugin avec du code en brût.
    Compil your life guy!
    The Aures Project

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/12/2005, 18h28
  2. batch qui execute du code
    Par fbu78 dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 22h31
  3. Executer du code binaire au sein d'un programme
    Par Hidekii dans le forum MFC
    Réponses: 13
    Dernier message: 07/09/2005, 22h10
  4. [FLASH MX2004] Rien ne se passe qd j'execute mon code
    Par adilou1981 dans le forum Flash
    Réponses: 2
    Dernier message: 27/07/2005, 23h31
  5. [C#]Comment executer du code qui se trouve dans une string ?
    Par freddyboy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/02/2005, 16h31

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