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 un programme avec un fichier depuis Python


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 4
    Par défaut Executer un programme avec un fichier depuis Python
    Bonjour,
    j'espère que je poste dans la bonne section et que le titre du sujet est explicite (sinon, je peux le modifier).

    Maintenant, je m'explique :
    Dans le cadre d'un projet, je dois développer une interface graphique qui fera le lien entre l'utilisateur et Scilab.
    Grosso modo, l'utilisateur va rentrer des informations (Fonctions de Transfert, Matrice, Pôles), et choisir ce qu'il désire afficher (Réponse temporelle, Diagramme de Bode...).
    J'arrive à récupérer les info entrées par l'utilisateur dans un "fichier.txt". Il faut ensuite que ce "fichier.txt" soit "exécuté" (pour reprendre les termes de scilab) par le programme Scilab, afin de lancer le calcul et m'afficher une courbe.

    Jusqu'à présent :
    Le fichier.txt que j'obtiens est correctement écrit pour être lu par scilab et obtenir le résultat voulu (en lançant Scilab, et en exécutant le fichier).
    Depuis mon script Python, j'arrive à associer à un bouton le lancement de Scilab (et ça marche).
    Maintenant, ce qui m'intéresse c'est d'associer à mon bouton mon fichier et le programme.

    le code associé au bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #Validation fonction de transfert et calcul Bode
    def repFCTbode():
       affichgain['text'] = egain.get() #Recuperation gain
       affichnum['text'] = enum.get() #Recuperation numerateur
       affichden['text'] = eden.get() #Recuperation denominateur
       fichier = open("fichier_fonction.txt", "w") # Ouvre le fichier.
       text="p=poly(0,'p')\nh=syslin('c',("+str(egain.get())+")*("+str(enum.get())+")/("+str(eden.get())+"))\nbode(h)" #ecriture de la fonction dans le fichier
       fichier.write(text) # Ecris la reponse tapee.
       fichier.close()
       monfichier = "/Users/pierrearnoux/Desktop/Programme_Python/fichier_fonction.txt"
       monprogramme = "/Applications/scilab-5.4.0-alpha-1.app/Contents/MacOS/bin/scilab"
       subprocess.Popen([monprogramme, monfichier])
    J'ai cherché et trouvé ceci pour résoudre mon problème :
    http://www.blog.pythonlibrary.org/20...le-or-program/

    Problème : on me dit que les fichiers ou repertoires n'existent pas.

    Après recherche je suis tombé sur ce sujet : http://www.developpez.net/forums/d12...bprocess-popen

    J'ai beau chercher à modifier de manière similaire, cela ne semble pas fonctionner (je suis sous Mac OS X aussi). Alors je sais pas si je fais faux pas quant à la méthode à utiliser, ou dans la syntaxe (je dois avouer ne pas trop capter ce que fait le -c ici).
    Ce que je cherche à obtenir, c'est qu'en cliquant sur mon bouton, scilab se lance et execute le code qui est créé juste avant, et ainsi m'affiche mon diagramme de Bode. (Bon, pour que ce soit plus simple, j'ai copié mon fichier dans le répertoire de Scilab, mais originellement, il se situe dans le même répertoire que mon script Python).

    Par ailleurs, j'ai une question générale à propos de Python. Mon script doit être fonctionnel sur Windows, Linux et Mac OS. Je viens de changer d'ordi (Win XP -> Mac Os) et quand j'ai maintenant un soucis avec les zones d'entrées.
    Dans mon interface graphique, j'ai des zones où j'entre des valeurs :
    problème, certains caractères font planter le programme : par exemple ^
    En gros, si je veux taper 1+4*p+5*p^2, ça plante au niveau du ^
    (mais je comprends pas, si je copie depuis un éditeur de texte ^ et le colle dans ma zone d'entrée, ça ne plante pas là...)

    Voilà, merci d'avoir lu.
    J'espère que ça ne va pas faire doublon avec un autre sujet (j'ai cherché, et n'ai rien trouvé de concluant jusqu'à présent).
    J'espère aussi avoir été assez clair quand à mon problème !
    Merci d'avance !

    Edit :
    Pour plus de clarté, quelques captures d'écrans (cliquer ouvre l'image) :
    Lorsque j'exécute mon script Python, mon interface graphique se lance, et je rentre les valeurs dans les champs correspondants :



    Le fichier .txt n'est pas créé. Je clique alors sur mon bouton Diagramme de Bode (le seul ayant une commande active pour l'instant pour lancer scilab et le tracé)



    Mon fichier est bien créé et pourtant Scilab ne se lance pas et n'exécute pas ce fichier.
    Pourtant le fichier est bien fonctionnel.
    Quand je lance Scilab, et "exécute" le fichier :






    J'obtiens bien mon tracé (mais ça m'arrangerait pas mal de faire en sorte que ce lancement et exécution du script soit géré par mon programme Python ) :


  2. #2
    Expert confirmé

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

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

    Essaye en mettant ta commande dans une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.Popen([monprogramme, monfichier])
    Autre chose, "/Applications/scilab-5.4.0-alpha-1.app/Contents/MacOS/bin/", c'est un chemin où tu as les droits d'écriture ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 4
    Par défaut
    Merci pour cette réponse !

    Citation Envoyé par VinsS Voir le message
    Salut,

    Essaye en mettant ta commande dans une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.Popen([monprogramme, monfichier])
    J'ai modifié ainsi, et je n'obtiens aucune erreur dans le shell python. Malgré tout, rien de se lance (mais le fichier .txt est bien créé par contre).
    Par ailleurs, j'ai remplacé le path de scilab par celui de TextEdit (au cas où ce serait l'autre programme qui poserait soucis) et là, même cas : TextEdit n'ouvre pas mon fichier .txt.

    Autre chose, "/Applications/scilab-5.4.0-alpha-1.app/Contents/MacOS/bin/", c'est un chemin où tu as les droits d'écriture ?
    En principe oui, mais par précaution je l'ai remplacé par le répertoire où est vraiment créé le fichier. Je remplace dans mon message d'origine.

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 306
    Par défaut
    Il faut voir si le process te retourne quelque chose, mais pour ça il faut le lui dire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    reply = subprocess.Popen([monprogramme, monfichier], 
                                    universal_newlines=True, 
                                    stdout=subprocess.PIPE).communicate()
     
    print reply
    communicate() retourne tout en une seule fois lorsque le process est fini.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 4
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Il faut voir si le process te retourne quelque chose, mais pour ça il faut le lui dire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    reply = subprocess.Popen([monprogramme, monfichier], 
                                    universal_newlines=True, 
                                    stdout=subprocess.PIPE).communicate()
     
    print reply
    communicate() retourne tout en une seule fois lorsque le process est fini.
    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
    Python 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:25:50) 
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "copyright", "credits" or "license()" for more information.
    >>> ================================ RESTART ================================
    >>> 
    ('/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    Usage:
    scilab <arguments>
     
    Possible arguments are:
          -display Display: for use under Xwindow systems to set a specific X server display.
          -d Display      : equivalent to -display Display.
          -e Instruction  : execute the scilab instruction given in Instruction argument.
          -e and -f arguments are mutually exclusive.
          -f File         : execute the scilab script given in File argument.                       
          -e and -f arguments are mutually exclusive.
          -l Lang         : set the current language. Lang can be equal to fr or en.
          -mem N          : set the initial stacksize, for use with -ns argument.
          -nb             : do not display the Scilab banner at starting time.
          -ns             : do not execute scilab.start startup file. This argument will disable many features in Scilab (Only use if you know what you are doing).
          -nouserstartup  : do not execute the user startup files SCIHOME/.scilab or SCIHOME/scilab.ini.
          -nw             : start Scilab without dedicated Scilab Window.
          -nwni           : start Scilab without the GUI, graphic and help features (batch mode). This argument disables the need of Java.
          -nogui          : See -nwni
          -args           : accept all extra arguments and make them available through sciargs
          -version        : print product version and exit.
          -h/--help       : display help about this command.
          --texmacs       : reserved for TeXMacs.
     
          All these arguments can be retrieved by the Scilab function sciargs.
     
    Several environment variables can be declared.
    SCIVERBOSE               Provides debugging information of the startup
    JAVA_HOME                Declares which Java Virtual Machine to use
    SCI_DISABLE_TK           Disable Tk (but not Tcl) features
    SCI_JAVA_ENABLE_HEADLESS Enable Java Headless VM (ie without GUI features)\n', None)
    C'est ce que j'obtiens dans mon Shell...
    Après, quant à la comprendre... (j'utilise Python pour la première fois sur ce projet en fait). Je suppose que les lettres "-e" seront à utiliser dans ma commande ?

    Edit : Je viens de tenter en insérant '-f' entre [monprogramme, '-f', monfichier] et scilab se lance en exécutant le script (mais ça foire dans le calcul )
    La piste semble bonne
    Edit 2 : bon, simple erreur en fait, j'avais écrit "P" au lieu de "p".

    En tout cas, ça marche, mon script s'exécute bien, et j'obtiens bien mon tracé ! Merci beaucoup !!
    Par contre, tant que je ne quitte pas Scilab, je ne peux revenir sur mon logiciel (j'ai l'icône ronde avec les couleurs, genre arc-en-ciel, comme quand un programme plante) : un moyen de modifier cela ?
    Mais à vrai dire j'hésite un peu car d'autres boutons doivent lancer d'autres script (d'autres diagramme, et je sais pas trop comment gérer cela par rapport aux fichiers...)

  6. #6
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 306
    Par défaut
    Oui, en fait 'reply' attend la réponse du process et est donc bloquant, il faudra le mettre dans un thread.

    Quoique si Scilab doit communiquer avec le serveur graphique, ça amenera d'autres problèmes.

    Bref faut tester.

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

Discussions similaires

  1. executer un programme avec exec
    Par stephane.gendron dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2010, 21h06
  2. Compiler un petit programme avec plusieurs fichiers avec g++
    Par Ourcoulouncoulou dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 16/12/2008, 13h48
  3. chemin où est executé un programme avec WxWidgets
    Par Jérémy Lefevre dans le forum wxWidgets
    Réponses: 1
    Dernier message: 23/01/2007, 14h16
  4. Comment executer un programme avec un bouton
    Par STEPH69000 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 09/08/2006, 19h48
  5. [Classpath][execution] executer un programme avec des jar.
    Par LoLoSS dans le forum Général Java
    Réponses: 11
    Dernier message: 26/08/2004, 11h45

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