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 :

Question à propos de l'utilisation de exec


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 751
    Points
    1 751
    Par défaut Question à propos de l'utilisation de exec
    Bonjour,
    je voudrais utiliser exec pour récupérer rapidement des infos contenues dans un fichier comme dans l'exemple simplifié ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec 'userOptions = {' + '"oo":"aa"' + '}'
    # userOptions est un objet Python obtenu sans effort.
    Est-ce une bonne pratique, ou mieux vaut-il parser le texte ' "oo":"aa" ', qui en pratique sera un morceau facile à repérer dans un fichier texte ?

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Ça veut dire quoi «récupérer» , please ?

  3. #3
    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 751
    Points
    1 751
    Par défaut
    Il va falloir que je fasse un stage sur l'art de bien poser des questions...

    Concrétement, j'ai un fichier TXT du type suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "couleur":"rouge"
    "taille":18
    Je récupère dans mon script Python chaque ligne du fichier TXT. Ensuite je les recolle en mettant des virgules, ce qui me donne une chaîne de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maChaine ='"couleur":"rouge", "taille":18'
    Ensuite dans mon code Python j'utilise exec comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec 'dicoOptions = {' + maChaine + '}'
    Remarque :ceci équivaut à mettre directement dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dicoOptions = {"couleur":"rouge", "taille":18}
    Je peux alors utiliser le dictionnaire dans mon code Python.


    Ma question est la suivante. L'utilisation de exec est-elle "propre" ou non ?

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 910
    Points : 7 290
    Points
    7 290
    Par défaut
    "couleur":"rouge"
    "taille":18
    C'est obligatoire? car sinon ça c'est mieux dans le fichier texte, il y aura moins de découpage

    couleur:rouge
    taille:18
    Sinon j'utiliserais readlines pour la lecture du fichier, puis la méthode split pour virer ":" et "\n".

    Tu auras une liste, et tu pourras ajouter tout ça dans ton dico

    un truc du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dico={}
    dico["couleur"]="rouge" # a remplacer par rapport aux index de ton tableau
    le exec par contre je ne vois toujours pas son intérêt, excuse moi, mais je ne comprend pas ce que tu veux faire avec.

  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 751
    Points
    1 751
    Par défaut
    Ma question porte juste sur le exec. Pour le reste je sais faire.

    En fait, le format utilisé dans le fichier TXT est un moyen de stocker des données Python du type OPTIONS-UTILISATEUR au sein d'autres données non Python du type TEXTE-A-IMPRIMER.

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 910
    Points : 7 290
    Points
    7 290
    Par défaut
    exec est utilisé pour exécuter une ou plusieurs instructions dans une chaine ou un fichier texte.

    Ce n'est pas le cas dans ton exemple.

    Se sont plus des arguments qu'une instruction.

    Dans ton cas, je ferais quelquechose comme ceci :

    Selon la complexité malheureuse de ton fichier texte avec ses ".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fichier=open("test.txt", "r")
    data=fichier.readlines()
    fichier.close()
     
    dico={}
     
    for ligne in data:
        ligne=ligne.split(":")
        lignes=ligne[1].split("\n")
        dico[ligne[0]]=lignes[0]
     
    print dico
    ou encore avec les ' en moins sur le résultat de ton dico en utilisant eval

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fichier=open("test.txt", "r")
    data=fichier.readlines()
    fichier.close()
     
    dico={}
     
    for ligne in data:
        ligne=ligne.split(":")
        lignes=ligne[1].split("\n")
        dico[eval(ligne[0])]=eval(lignes[0])
     
    print dico
    donne le résultat de ton dico

    {'couleur': 'rouge', 'taille': 18}

  7. #7
    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 751
    Points
    1 751
    Par défaut
    Merci pour ces lignes. En fait, le fichier A de mon 2nd post est créé afin de stocker des infos récupérées après l'analyse d'un 1er fichier.

    Le fichier stocké sera utilisé par d'autres scripts. Je veux donc avoir un accès rapide aux données sans repasser par une analyse via un parser comme proposé ci-dessus.

    Je voulais juste savoir si la pratique via exec était bonne, coûteuse...

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 910
    Points : 7 290
    Points
    7 290
    Par défaut
    Je peux juste te dire qu'exec est plutôt déconseillé


  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonsoir,

    je te conseille d'aller lire ces liens:

    http://docs.python.org/library/configparser.html
    http://www.red-dove.com/python_config.html

    je pense qu'il y a moyen de plus t'embêter si tu choisis un de ces deux modules

  10. #10
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Parfois je me demande si je ne devrais pas suivre un stage sur la façon de comprendre les questions.
    Mais ce n'est pas encore ce coup-ci qui va m'en convaincre.
    Lisant
    Je récupère dans mon script Python chaque ligne du fichier TXT
    ENSUITE je les recolle en mettant des virgules
    ENSUITE dans mon code Python j'utilise exec
    je constate que tu dis toi-même que l'utilisation d'exec est POSTÉRIEURE à la récupération des données, et que ce n'est donc pas à exec qu'est dévolue la tâche de récupérer les données, contrairement à ce que tu as écrit dans ta première phrase
    je voudrais utiliser exec pour récupérer rapidement des infos
    que j'ai comprise selon le sens qu'elle exprime.





    Ceci dit, je trouve que ta pratique de conservation et de récupération d'information est de la tambouille, alors que sont disponibles dans Python de nombreuses ressources pensées pour répondre à une grande étendue de besoins prévisibles.
    La persistance de données est un tel besoin et tu tirerais profit de consulter
    http://docs.python.org/3.1/library/persistence.html



    Il y a par exemple pickle qui permet de faire des choses bien et simples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    li = [23,45,34,1,7,56]
    lo = ['vintr','karants','trentkatr','un','sept','saint kantsis']
    d = dict(zip(li,lo))
     
    import pickle
     
    f = open('pickessai','w')
     
    pickle.dump(d,f)
    pickle.dump(li,f)
     
    f.close()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import pickle
     
    f = open('pickessai','r')
     
    dico = pickle.load(f)
    print dico
     
    l = pickle.load(f)
    print l
     
    f.close()




    Dans le post suivant de Tyrtamos, il y a aussi un exemple sur shelve,
    ainsi qu'une méthode astucieuse de mise en fichier texte de structures de données au moyen de repr() et eval() :
    http://www.developpez.net/forums/d81...e/#post4690829






    Pour ce qui est de ta question proprement dite, le coût de l'utilisation de exec() , que recouvre cette notion de coût pour toi: vitesse ? mémoire ? fiabilité ? lisibilité ?....

    Je ne m'y connais pas assez pour apporter une réponse fondée.

    Je peux simplement citer ceci qui me semble malheureusement assez adapté dans sa totalité à ta méthode et à ton questionnement:

    Plus sérieusement: quel est ton cas d'utilisation ? Pourquoi cherches-tu
    a faire d'une façon incompréhensible et compliquée quelque chose de (a
    priori) fondamentalement simple ? Je me doute bien que tu a tes raisons,
    mais il y a de fortes chances que tu sois parti sur une mauvaise
    solution à un vrai problème. Les cas d'utilisation "valides" de exec ou
    eval sont en pratique extrêmement rares - il y a le plus souvent (+ de
    90% des cas que j'ai pu rencontré en quelques 8 années) une meilleure
    façon de faire.

  11. #11
    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 751
    Points
    1 751
    Par défaut
    Citation Envoyé par eyquem Voir le message
    ...je constate que tu dis toi-même que l'utilisation d'exec est POSTÉRIEURE à la récupération des données, et que ce n'est donc pas à exec qu'est dévolue la tâche de récupérer les données.

    Ceci dit, je trouve que ta pratique de conservation et de récupération d'information est de la tambouille, alors que sont disponibles dans Python de nombreuses ressources pensées pour répondre à une grande étendue de besoins prévisibles.
    L'utilisation de eval, exec et cPickle n'est pas sans danger. Un exemple et une solution sont données dans le cas de pickle dans cette page : http://nadiana.com/python-pickle-insecure .

    Finalement, je vais me tourner vers cPickle. Cela va me convenir car mes infos sont à enregistrer lors du parcours des lignes de texte analysé.

    Citation Envoyé par eyquem Voir le message
    Pour ce qui est de ta question proprement dite, le coût de l'utilisation de exec() , que recouvre cette notion de coût pour toi: vitesse ? mémoire ? fiabilité ? lisibilité ?...
    La fiabilité arrive en premier et pour le coup il faut faire attention comme le montre la page indiquée ci-dessus.

    Citation Envoyé par eyquem Voir le message
    Parfois je me demande si je ne devrais pas suivre un stage sur la façon de comprendre les questions...
    Je suis en plein développement du coup je me pose effectivement des questions un peu dans tous les sens.

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

Discussions similaires

  1. Question à propos de oShell.Exec
    Par jlachapelle dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/08/2008, 17h20
  2. Petite question à propos du redbook...
    Par Michaël dans le forum OpenGL
    Réponses: 3
    Dernier message: 04/11/2004, 12h54
  3. Petite question à propos d'une requete
    Par ViBy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/09/2004, 12h21
  4. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 14h03
  5. Comment utiliser Site Exec sous FTP
    Par phig dans le forum Développement
    Réponses: 2
    Dernier message: 12/08/2003, 17h11

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