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 :

Problème avec reload


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Problème avec reload
    Bonjour,
    je ne vois pas ce qui cloche dans le code suivant car il ne recharge pas la nouvelle version du module. Quelqu'un voit-il pourquoi ? Et surtout comment peut-on faire pour que le nouveau module soit bien rechargé ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
     
    import os, sys
     
    # 1ère version.
    fichierModule = open("moduleTest.py",'w')
    codeModule = """#!/usr/bin/env python
    #-*- coding: utf-8 -*-
     
    print 'Je suis la version No 1 du module.'
    print 'Ma fonction F additionne x et y.'
     
    def F(x, y):
        return (x+y)"""
    fichierModule.write(codeModule)
    fichierModule.close()
     
    # 1er import.
    import moduleTest
     
    print 'F(4,7)=' + str(moduleTest.F(4,7))
     
     
    # 2ème version.
    print '='*30
    fichierModule = open("moduleTest.py",'w')
    codeModule = """#!/usr/bin/env python
    #-*- coding: utf-8 -*-
     
    print 'Je suis la version No 2 du module.'
    print 'Ma fonction F multiplie x et y.'
     
    def F(x, y):
        return (x*y)"""
    fichierModule.write(codeModule)
    fichierModule.close()
     
    # 2ème import.
    reload(sys.modules['moduleTest'])
     
    print 'F(4,7)=' + str(moduleTest.F(4,7))

  2. #2
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Finalement j'ai trouvé une solution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
     
    import os, sys
     
    # 1ère version.
    fichierModule = open("moduleTest.py",'w')
    codeModule = """#!/usr/bin/env python
    #-*- coding: utf-8 -*-
     
    print 'Je suis la version No 1 du module.'
    print 'Ma fonction F additionne x et y.'
     
    def F(x, y):
        return (x+y)"""
    fichierModule.write(codeModule)
    fichierModule.close()
     
    # 1er import.
    import moduleTest
     
    print 'F(4,7)=' + str(moduleTest.F(4,7))
     
     
    # 2ème version.
    print '='*30
    fichierModule = open("moduleTest.py",'w')
    codeModule = """#!/usr/bin/env python
    #-*- coding: utf-8 -*-
     
    print 'Je suis la version No 2 du module.'
    print 'Ma fonction F multiplie x et y.'
     
    def F(x, y):
        return (x*y)"""
    fichierModule.write(codeModule)
    fichierModule.close()
     
    # 2ème import.
    os.remove('moduleTest.pyc')
    reload(sys.modules['moduleTest'])
     
    print 'F(4,7)=' + str(moduleTest.F(4,7))
    Il faut détruire la version compilé du module. Cela m'étonne beaucoup que Python ne gère pas cela directement. Est-ce dû à une mauvaise utilisation de ma part de la fonction reload ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    A mon avis, Python part juste du principe que les fichiers code ne changent pas pendant l'exécution et donc l'interpréteur ne retest pas les dates de modification de fichiers pour savoir s'il faut générer à nouveau le pyc.
    De ce fait le fichier compilé pyc, qui était valide au début de l'exécution, est toujours supposé valide quand tu reload() le module.

    Maintenant cette explication est à prendre avec des pincettes, c'est juste une intuition personnelle. Mais ca me parait logique, au final.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 139
    Points
    139
    Par défaut
    En fait, sur Windows j'ai le même problème. En ajoutant un time.sleep(10) avant la création du deuxième fichier, le reload se fait correctement. Je pense donc que c'est un problème de précision dans la comparaison des dates.

  5. #5
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    D'accord pour ces explications mais lorsque je fais un reload, je m'attends à ce que Python fasse... un reload. Peu importe la date de changement. Non ?

  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
    Non justement, car lorsque Python importe un module, il recherche d'abord si une version compilée (.pyc ou .pyo) existe, et vérifie sa validité (c'est là que les dates interviennent). Dans ton cas, à mon avis comme il y a de grandes chances que la modification du fichier et le reload se fassent trop vite, et donc que pour Python le fichier compilé est toujours valide au moment où il doit le recharger.

  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
    Dans le code source python, on trouve la fonction suivante dans Python/import.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static FILE *
    check_compiled_module(char *pathname, time_t mtime, char *cpathname)
    Il y a bien une notion de temps avec les pyc .

  8. #8
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par oiffrig Voir le message
    Dans ton cas, à mon avis comme il y a de grandes chances que la modification du fichier et le reload se fassent trop vite, et donc que pour Python le fichier compilé est toujours valide au moment où il doit le recharger.
    Effectivement. Pour ce que je veux faire, j'aurais à recharger un module fait récemment dans certains cas.

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

Discussions similaires

  1. problème avec reload()
    Par ProgVal dans le forum Général Python
    Réponses: 6
    Dernier message: 10/04/2010, 09h28
  2. [AJAX] Ajax - avec reload
    Par KHVince dans le forum AJAX
    Réponses: 3
    Dernier message: 28/08/2009, 11h16
  3. [AJAX] location.reload() en ajax avec IE7
    Par kakahn dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/05/2007, 10h29
  4. Problème avec opener.location.reload
    Par Joooooon dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/06/2006, 18h58
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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