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 :

Executer du code Python


Sujet :

Python

  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 267
    Points : 4 066
    Points
    4 066
    Par défaut Executer du code Python
    Bonjour,

    Dans le cadre de mon travail, j'ai besoin de lancer différent traitements qui sont variables et qui prennent 2 parametres.
    J'ai l'arborescence suivante :
    /main.py
    /module/loader.py (programme lançant les traitements)
    /traitement/nom_du_traitement/Launch_nom_du_traitement.py (traitement a effectuer)

    J'ai essayé ceci mais j'ai une erreur de syntaxe pour l'import :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    eval('from traitement.t1 import *')
    res=eval("Launch_t1('a.bmp', 'b.bmp')")

    Avez vous des pistes ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Une question. Pourquoi faire un eval, vu que tout y est codé en dur? o_O
    L'erreur est elle relative à l'arborescence? (le message d'erreur serait d'une grande aide )
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Rah, cette manie d’utiliser eval() à tout bout de champ…

    Tu ne donnes pas beaucoup de détails (c’est le moins qu’on puisse dire), mais j’imagine que tes noms d’outils sont sous forme de string générées dynamiquement*? Dans ce cas, utiliser __import__ et getattr devrait faire l’affaire… quelque chose comme*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    name = "t1"
    modname = '.'.join(("traitement", name, "Launch_" + name))
    procname = "Launch_" + name
    mod = __import__(modname)
    proc = getattr(mod, procname)
    res = proc("a.bmp", "b.bmp")
    PS*: Et pense à donner tes messages d’erreur, ça peut aider à t’aider, des fois…

    PPS*: Ton erreur provient peut-être du fait que traitement/t1 n’ait pas de __init__.py, ce qui en fait donc (iirc) un package et pas un module –*et on ne peut pas importer un package*! D’autant que si j’ai bien suivi, Launch_t1() est définie dans le module traitement.t1.Launch_t1, et ne sera donc de toute façon pas importée dans l’espace de nom à partir de t1 (sauf à exporter cette fonction dans le fichier __init__.py…).

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 267
    Points : 4 066
    Points
    4 066
    Par défaut
    J'avais bien penser aux fichiers __init_.py dans chaque dossier (cependant, ils sont vide, je ne sais pas sis je dois mettre quelque chose dedans)

    mont29, je viens d'essayer ce que tu m'as donné sur mon script de test :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ob='metric/boats.bmp'
    ib='metric/boats2.bmp'
    print 'Testing MSE (PYTHON)'
    mod = __import__('metric.MSE.Launch_MSE')
    proc= getattr(mod, 'Launch_MSE')
    res = proc(ob, ib)
    Et j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "test.py", line 31, in <module>
        proc= getattr(mod, 'Launch_MSE')
    AttributeError: 'module' object has no attribute 'Launch_MSE'
    Voici le contenu de Launch_MSE.py (dans /metric/MSE/):
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def Launch_MSE(ref, img):
        from . import *
        res = mse(ref,img)
        return float(res)
    Et celui de mse.py (dans /metric/MSE/) :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from pylab import imread, mean
    def mse(imgO, imgD):
        imgA = imread(imgO)
        imgB = imread(imgD)
        if len(imgA)==0 or len(imgB)==0:
            print "PRoblemmme de lecture de fichier"
        mse = mean(mean((imgA - imgB)**2))
        return float(mse)

  5. #5
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Eeeek*! D’après les trois premiers bouts de code que tu donnes, n’y a aucune raison que ça ne marche pas*???

    Apparemment, l’import lui-même se passe sans problème… Peut-être une histoire de version python (j’ai testé avec la 3.2, mais je ne vois pas pourquoi ça ne marcherait pas avec les 2.x…)*?

    Petit réflexe de debug*: utiliser dir(). Autrement dit, que produit ce code (le bug sera toujours là, ce qui est intéressant c’est ce qui est affiché juste avant)*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ob='metric/boats.bmp'
    ib='metric/boats2.bmp'
    print 'Testing MSE (PYTHON)'
    mod = __import__('metric.MSE.Launch_MSE')
    print(dir(mod))
    proc= getattr(mod, 'Launch_MSE')
    res = proc(ob, ib)

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 267
    Points : 4 066
    Points
    4 066
    Par défaut
    J'ai résolu mais la solution est moche
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mod = __import__('metric.MSE.Launch_MSE')
    proc= getattr(eval('mod.MSE.Launch_MSE'), 'Launch_MSE')
    res = proc(ob, ib)
    Avec dir(mod), ça me donnait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ['MSE', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

  7. #7
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Ach*! Ze zuis vort dézolé… Dout za z’est de ma vaute…

    En fait, c’est le même problème que
    … qui ne permet pas d’utiliser path directement (il faut écrire os.path, ou alors faire import os.path as path…).

    Voici un code qui devrait marcher, cette fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ob='metric/boats.bmp'
    ib='metric/boats2.bmp'
    print 'Testing MSE (PYTHON)'
    mod = __import__('metric.MSE.Launch_MSE')
    mod = getattr(mod, 'MSE')  # mod is now metric.MSE
    mod = getattr(mod, 'Launch_MSE')  # mod is now metric.MSE.Launch_MSE
    proc= getattr(mod, 'Launch_MSE')
    res = proc(ob, ib)
    C’est pas forcément très beau, mais nettement plus (et plus sûr, aussi) que eval()…

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 267
    Points : 4 066
    Points
    4 066
    Par défaut
    Merci mont29, ça fonctionne avec ta solution.

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

Discussions similaires

  1. Executer un script Python depuis un code C++
    Par Niak74 dans le forum C++
    Réponses: 4
    Dernier message: 02/02/2011, 10h19
  2. executer du code python contenu dans une variable
    Par awalter1 dans le forum Général Python
    Réponses: 6
    Dernier message: 11/11/2010, 21h22
  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