N-PN White-Hat Project
[Python] Modifier des fonctions pendant le programme - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages interprétés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=27)
+--- Sujet : [Python] Modifier des fonctions pendant le programme (/showthread.php?tid=2488)



[Python] Modifier des fonctions pendant le programme - InstinctHack - 10-12-2012

Bonjour à tous Smile
Je m'amuse de nouveau avec mon bot irc, mais ça commencer à me taper sur le système de devoir reload à chaque modif, j'aimerais donc pouvoir surcharger les fonctions dans le temps.
Je n'ai pas trouver de solution sur internet, alors j'ai commencer à bidouiller un script...

Code PYTHON :

    #/usr/bin/python python
    # -*- coding: utf-8 -*-
     
    #ceci est la technique classique d'inclusion
    #import lib
     
    print 'démarrage du programme'
     
    print "\t"+'Inclusion des librairies en cours...'
     
    import time
    import threading
    import os
     
    print "\t"+'Inclusion des librairies terminées.'
     
    def maj_simple():
        while True:
            print "\t"+'démarrage de la fonction de mise à jour simple'
     
            def test():
                    print '1'
            print 'Fonction test première déclaration'
            time.sleep(5)
            def test():
                print '2'
            print 'Fonction test deuxième déclaration'
            global test
            time.sleep(5)
     
    def maj_complexe():
        global lib
     
        while True:
            print 'mise à jour'
    #        if os.path.isfile('lib.pyc'):
     #          os.remove('lib.pyc')
            global lib
            del(lib)
            import lib as lib
            global lib
            time.sleep(5)
        lib.send_data()
     
    def boucle():
        global lib
        while True:
            test()
    #        lib.send_data()
            time.sleep(1)
     
    threading.Thread(None,maj_simple   ,None,(),{}).start()
    time.sleep(2)    
#    threading.Thread(None,maj_complexe   ,None,(),{}).start()
 #   time.sleep(2)
    threading.Thread(None,boucle,None,(),{}).start()
     
#    fichier = open("lib.py", "r")
#    toutesleslignes = fichier.readlines()
 #   print toutesleslignes
 #   function=eval("print 'envoi des données en ecours...'")
 #   function()
#    fichier.close()
     
 


Mon fichier lib.py
Code PYTHON :

#/usr/bin/python python
# -*- coding: utf-8 -*-
     
def send_data():
       print 'envoi des données en ecours...'
print "Inclusion du fichier lib.pdy"
 


Donc résultat c'est fonctionnel la fonction change bien, mais il faut qu'elle soit dans le fichier lanceur, donc c'est pas ce que je veut, je n'ai pas réussit à utiliser eval et del ne semble pas marcher...
Avez-vous une idée pour pouvoir faire ça ?


RE: [Python] Modifier des fonctions pendant le programme - supersnail - 10-12-2012

Personnellement, je ne pense pas que tu puisses relancer le mainfile directement...

Pour ma part (ce que j'ai fait avec Canard_WC & ProjectBot) c'est un core qui se contente juste de gérer la connexion au serveur IRC, de recevoir les messages, les envoyer et de dispatch des évènements lorsqu'un message est reçu/envoyé/etc.

Toutes les features du bot se retrouvent donc dans des fichiers séparés, contenant une fonction module_init chargée d'enregistrer un callback pour les évènements à traiter, et une fonction module_unload qui va supprimer les callback enregistrés par module_init.

Ainsi module_init se retrouve appelé après le chargement du module, et module_unload appelé avant le déchargement du module (et je définis une liste de modules à charger au démarrage du bot) Wink


RE: [Python] Modifier des fonctions pendant le programme - spin - 10-12-2012

Il existe des techniques pour faire du hot swaping (modifier du code à chaud), si c'est ce que tu cherches à faire, et certains langage le permettent même nativement. Python n'a pas l'air d'en faire partie, néanmoins après une petit recherche j'ai trouvé des trucs éventuellement intéressants :

Un topic sur StackExchange où l'OP propose une solution : http://stackoverflow.com/questions/6751263/hot-swapping-of-python-running-program (la dernière réponse peut aider je pense).
Un module Python pour gérer le hot swapping : http://pypi.python.org/pypi/hotswap/0.1