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 données dans un fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut executer données dans un fichier
    Salut les amis du python,

    je souhaites exécuter des lignes de code qui se trouvent dans un fichier texte (que je souhaite remplir à mon aise un peu n'importe quand).
    Pour arriver à mes fins j'ai déjà commencé par un exemple simple mais ça me pose problème.

    Pour mon code test j'ai tout d'abord fait un fichier texte nommé "textInput" et qui se trouve en PJ avec un code que je souhaite exécuter.

    Voici le contenu de ce fichier texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a=2
    if a>0:
        ####premier test
        y.append(5*np.exp(-0.1*x))
        y.append(5*np.exp(-0.15*x))
    else:
        ####second test
        y.append(5*np.exp(-0.3*x))
        y.append(5*np.exp(-0.5*x))
    Et voici mon programme:
    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
     
    import numpy as np
    import matplotlib.pyplot as plt
    x=np.linspace(0,50,100)
    fileIn=open("textInput.txt","r");
    allData=fileIn.readlines();
    fileIn.close()
    y=[]
    for i in range(0,len(allData),1):
        exec(allData[i])
    colorVect=["b-","r-","g-","ko"]
    p=plt.figure(1)
    for i in range(0,len(y),1):
        p=plt.plot(x,y[i],colorVect[i])
    plt.show()
    Tout ceci ne plaît pas trop à python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if a>0:
              ^
    SyntaxError: unexpected EOF while parsing
    à cause du "if" et effectivement si je le vire mon code fonctionne

    Le soucis dans cette histoire est que moi j'aimerais bien pouvoir mettre des conditions et des boucles pouvez vous me dire comment faire s'il vous plait ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Si je te suis bien, il suffit que tu changes l'extension txt par py et ensuite tu modifies ton code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import numpy as np
    import matplotlib.pyplot as plt
    import textInput
    x=np.linspace(0,50,100)
    colorVect=["b-","r-","g-","ko"]
    p=plt.figure(1)
    for i in range(0,len(y),1):
        p=plt.plot(x,y[i],colorVect[i])
    plt.show()
    Cela dit, cette exécution de code ne semble servir à rien et se plantera car y n'est pas défini.

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Chaque ligne présentée à exec est censée être une instruction complète, ce qui n'est pas le cas du "if a>0:"

    Voilà des lignes qui devraient marcher tout en faisant la même chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=2
    y += [5*np.exp(-0.1*x), 5*np.exp(-0.15*x)] if a>0 else [5*np.exp(-0.3*x), 5*np.exp(-0.5*x)]

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    Bonjour tous les 2 et merci pour votre réponse !!!

    Citation Envoyé par VinsS Voir le message
    Salut,
    Si je te suis bien, il suffit que tu changes l'extension txt par py et ensuite tu modifies ton code comme suit:
    Cela dit, cette exécution de code ne semble servir à rien et se plantera car y n'est pas défini.
    Vins, ta réponse ne convient pas mais c'est de ma faute: je n'ai pas été très précis.

    Voici le contexte :
    - je suis en train de faire un petit programme qui me rend bien service dans mon boulot et j'aimerais le partager avec des collègues qui n'y connaissent rien en python (et en programmation) et qui n'ont même pas nécessairement python (windows) et/ou toutes les bibliothèques que j'ai d'installé sur mon PC.
    - la solution que j'ai trouvé c'est faire un programme standalone que je leur donne et qu'ils n'ont qu'à lancer en donnant leur nom de fichier input
    - maintenant il est possible que certains ont envie de changer l'équation de base et j'aimerais qu'ils puissent rentrer cette équation dans un simple fichier texte et que mon programme lise le contenu et l’exécute sans qu'ils aient à essayer de programmer quelque chose dans le code.
    - à priori ils n'ont même pas besoin de faire des "if" et des "for" mais j'aimerais quand même laisse cette possibilité (au moins pour moi qui peut être aussi amené à utiliser ce programme sur des machines où je ne suis pas administrateur et ou je n'ai pas forcement python).

    Citation Envoyé par tyrtamos Voir le message
    Bonjour,
    Chaque ligne présentée à exec est censée être une instruction complète, ce qui n'est pas le cas du "if a>0:"
    Voilà des lignes qui devraient marcher tout en faisant la même chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=2
    y += [5*np.exp(-0.1*x), 5*np.exp(-0.15*x)] if a>0 else [5*np.exp(-0.3*x), 5*np.exp(-0.5*x)]
    Merci beaucoup tyrtamos pour ta réponse! je n'ai pas essayé mais je pense que ça va parfaitement convenir.

    Sinon j'ai pensé à autre chose au cas où je souhaites vraiment executer le code que je n'ai montré (qui est plus lisible et facile à écrire pour un débutan éventuellement intéressé pour faire ce genre de chose) :

    1°: je lit ligne par ligne le fichier et si les premières lettres sont "if" ou "for" j'utilise la fonction "eval" pour les lire car éval n'a pas le même problème que "exec"

    2°: si les premières lettres ne sont pas "if" ou "for" alors j'utilise la fonction "exec" qui elle permet de déclarer des variables à la volée comme dans mon exemple (qui fonctionne si j'enlève les if)

    je vais étudier ça, si quelque chose d'autre vous viens à l'esprit n'hésiter pas à me dire votre avis

    merci pour votre aide,
    bonne journée

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par membreComplexe12 Voir le message
    1°: je lit ligne par ligne le fichier et si les premières lettres sont "if" ou "for" j'utilise la fonction "eval" pour les lire car éval n'a pas le même problème que "exec"
    Ça m'étonnerait fort que ça marche: eval ne sait que calculer des expressions (c'est à dire un texte qui pourraient se trouver à droite du signe '=' d'une affectation). Même "a=2" ne marcherait pas à cause du '=', alors "if..."!

    Peut-être faudrait-il regarder une solution de type "import" qui lancerait l'exécution de la page complète et non ligne par ligne?

    Et puis il faut toujours garder à l'esprit que "exec" (eval aussi dans une moindre mesure) est un trou de sécurité pour des programmes destinés à être diffusés.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Ça m'étonnerait fort que ça marche: eval ne sait que calculer des expressions (c'est à dire un texte qui pourraient se trouver à droite du signe '=' d'une affectation). Même "a=2" ne marcherait pas à cause du '=', alors "if..."!
    je n'ai pas eu encore le temps de tester mais après réfléxion je pense que tu as raison

    Citation Envoyé par tyrtamos Voir le message
    Peut-être faudrait-il regarder une solution de type "import" qui lancerait l'exécution de la page complète et non ligne par ligne?
    je ne savais pas que "import" pourvait faire ceci c'est exactement ce qu'il me faut
    en fait moi je veux executer tout le contenu d'un fichier et je pensais que seul "eval" et "exec" me permettait de faire ceci.

    Je suis début en python, pour moi la fonction "import" est juste une fonction que j'utilise dans l'en tête de mes fichiers pour pouvoir utiliser des fonction contenues dans des fichiers .py.... mais d'après ce que tu me dis je comprends que la fonction import execute le code contenu dans le fichier lorsqu'on l'appelle ?

    Et du coup je pourrais appeler la fonction import sur un fichier texte également ? Si non alors je risque d'être bloqué puisque j'aimerais "compiler" mon code au préalable, avant d'avoir remplit ce fichier texte...

    Citation Envoyé par tyrtamos Voir le message
    Et puis il faut toujours garder à l'esprit que "exec" (eval aussi dans une moindre mesure) est un trou de sécurité pour des programmes destinés à être diffusés.

    Oui j'ai vu pas mal de discussion à propos de ceci mais si je n'arrive à résoudre le problème qu'avec "eval" ou "exec" alors je dirais bien à mes collègues de faire attention à ça. C'est pas un programme destiné à être vendu, plus un petit logiciel que l'on peut trimbaler sur n'importe quel PC pour résoudre rapidement un problème de mathématique.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par membreComplexe12 Voir le message
    Je suis début en python, pour moi la fonction "import" est juste une fonction que j'utilise dans l'en tête de mes fichiers pour pouvoir utiliser des fonction contenues dans des fichiers .py.... mais d'après ce que tu me dis je comprends que la fonction import execute le code contenu dans le fichier lorsqu'on l'appelle ?
    Quelques manip. sur un coin de table...
    Prenez une suite d'instructions dans une chaîne de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> stmt = '''a = 1
    ... print ("a", a, "b", b)
    ... '''
    >>>
    Pour lui appliquer "exec" sans erreur, il faudra qu'il trouve "b" dans le "globals()":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> b = 1
    >>> exec(stmt)
    a 1 b 1
    Si on s'amuse a faire cela avec import d'un module, çà ne va pas fonctionner car ce ne sera pas le même "globals()".
    En mimant ce que fait "import":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> module = types.ModuleType('module')                 # on crée un module...
    >>> exec(stmt, module.__dict__, module.__dict__)    # on compile ce qu'il y a dedans...
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<string>", line 2, in <module>
    NameError: name 'b' is not defined
    >>>
    Corrigeons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> stmt = '''a = b = 1
    ... print ("a", a, "b", b)
    ... '''
    >>> module = types.ModuleType('module')
    >>> exec(stmt, module.__dict__, module.__dict__)
    a 1 b 1
    >>> module.a
    1
    >>> module.b
    1
    >>>
    L'interface entre ce qui sera entré par les utilisateurs et le code qui sera exécuté in fine ne sera pas la même.
    => import exécute du code mais "le contexte" est différent.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/10/2005, 12h24
  2. [](VB) Récupérer les données dans un fichier .xml
    Par Furius dans le forum VBScript
    Réponses: 4
    Dernier message: 02/10/2005, 20h39
  3. [XML] stocker des données dans un fichier XML
    Par R3iTt0R dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/05/2005, 16h51
  4. Réponses: 3
    Dernier message: 22/02/2004, 20h09
  5. Temps d'accès à des données dans un fichier
    Par TONIAPEL dans le forum Assembleur
    Réponses: 5
    Dernier message: 28/09/2003, 15h21

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