[python] problème sur os.popen

Bonjour,

J'ai mis en place une serie de commandes dos dans une def grace à os.popen mais j'ai un souci à l'utilisation puisque j'ai toujours le message d'erreur suivant :

there's an error in your program : EOL while scanning single-quoted string


Alors j'ai essayé avec des simples quotes mais sans résultat.

Pouvez vous m'aider ?

Merci beaucoup

Le programme doit a l'aide winrar mettre le fichier en autoexecutable, et ensuite à l'aide de sendemail l'envoyer à une personne.

ps : je sais qu'il y a une fonction mail dans python mais on m'a demandé de faire comme cela donc je fais comme cela :-°

Voici mon code :

<code>

# -*- coding: utf-8 -*-
# importation du cadre graphique
from Tkinter import *
# importation des commandes dos
import os

# Mise en place des définitions
def envoi ():
os.popen("cd \")
os.popen("C:\program files\winrar\")
os.popen(rar a -sfx c:\Logimet\BDD_Logimet c:\Logimet\BDD_Logimet.mdb")
os.popen ("C:\sendEmail-v155\sendemail.exe -f ttrit@bidule.fr -t muche@aol.com -u test -m message -s smtp.machin.fr -xp mdp")

# Mise en place de la fenêtre
fen1=Tk()
fen1.title('Envoi manuel des mails Logimet')
ent1=Label (fen1,text='mail')
ent1.grid(row=0,column=0)
bou=Button(fen1,text='Envoi',command=(lambda:envoi()))
bou.grid(row=0,column=1)

# Mise en place de la sortie du programme
entf=Label(fen1,text='Quitter le programme',fg='red')
entf.grid(row=25,column=1)
bouf=Button(fen1,text='Quitter',command=fen1.destroy)
bouf.grid(row=25,column=2)

#Déroulement du programme
fen1.mainloop()<_code>

L'erreur a priori est montrée par l'idle phyton au niveau de la parenthèse fermante de la première commande os.popen dans la def
Configuration: Windows XP
Firefox 3.0.5

12 réponses

  • Votes
  • Date
  • Date décroissante
  1. ok, c'est bon

    En fait faut rajouter un \ pour eviter que le " soit pris comme caractère d'echappement.

    Par contre la ligne :
    os.popen(rar a -sfx c:\Logimet\BDD_Logimet c:\Logimet\BDD_Logimet.mdb") 


    me renvoie 1 et ne s'execute pas.

    Une idée ?

    Merci encore pour votre aide

    Amicalement
    Steph70
    1. Déterrons un peu le topic.
      En fait la méthode "popen" du module "os" python est obsolète.
      Il faut pour cela utiliser in commande "Popen" (avec une majuscule) du module "subprocess", je l'ai teste en faisant du "ssh" avec "plink" et ça marche bien.

      Bon je me doute bien que ce problème à du être résolu depuis le temps mais au cas ou quelqu'un tomberait dessus, il aurais au moins une solution.

      Voila le lien vers l'API Python:
      http://docs.python.org/library/subprocess.html?highlight=popen#subprocess.Popen.stdout

      et un autre pour la conversion des anciennes commandes :
      http://docs.python.org/library/subprocess.html?highlight=popen#replacing-older-functions-with-the-subprocess-module

      Cordialement
      1. re et encore merci

        Et bien non ca ne me renvoi rien du tout.

        J'ai essayé en changeant juste ma commande mais meme résultat :

        os.popen("start \"c:\program files\winrar\rar a -sfx c:\Logimet\BDD_Logimet c:\Logimet\BDD_Logimet.mdb\"")
        <open file 'start "c:\program files\winrar
        ar a -sfx c:\Logimet\BDD_Logimet c:\Logimet\BDD_Logimet.mdb"', mode 'r' at 0x00B368D8>
        >>> p=os.popen("start \"c:\program files\winrar\rar a -sfx c:\Logimet\BDD_Logimet c:\Logimet\BDD_Logimet.mdb\"")
        >>> print p.read()
        
        


        Comme tu le vois, juste après le print p.read ca reste obstinément vide et rien ne se fait dans le dossier de destination alors que la commande dos identique fonctionne.

        Amicalement
        Lonewolf
        1. Encore une fois merci Kilian.

          Par contre, meme si je ne vois pas la commande, je devrais voir le résultat dans le dossier voulu, c'est a dire l'apparition du dossier autoextratible créer par winrar, ce qui n'est pas le cas.

          C'est pour cela que je dis que la commande ne fonctionne pas meme si elle ne me renvoie pas d'erreur.

          Merci encore pour ton aide

          Amicalement

          Steph70
          1. Modérateur
            Ca t'affiche rien avec le read?
        2. Modérateur
          En fait popen renvoie un descripteur de fichier.
          En arrière plan, le processus s'execute bin mais tu ne le vois pas.
          Il faut appeler read() pour le voir:
          fd = os.popen("c:\program files\winrar\rar.exe a -sfx c:\Logimet\BDD_Logimet c:\Logimet\BDD_Logimet.mdb")
          print fd.read()
          fd.close()

          1. Un petit up de l'après midi,

            juste pour remonter un peu dans la liste.

            Lol

            amicalement
            Steph70
            1. Bonjour,

              Un petit up après une bonne nuit de sommeil

              Amicalement
              steph70
              1. Merci Kilian

                je viens d'essayer avec cette commande :

                os.popen("c:\program files\winrar\rar.exe a -sfx c:\Logimet\BDD_Logimet c:\Logimet\BDD_Logimet.mdb")


                Et voici le resultat :

                <code><open file 'c:\program files\winrar
                ar.exe a -sfx c:\Logimet\BDD_Logimet c:\Logimet\BDD_Logimet.mdb', mode 'r' at 0x00B36920><\code>

                et malheureusement pas d'execution

                Amicalement
                Steph70
                1. Désole kilian,

                  nos messages ont du se croiser.

                  Amicalement
                  Steph70
                  1. Modérateur
                    Ah oui pardon, c'est "\\"
                    Pour ta commande avec rar. Essaie de mettre le chemin complet vers l'executable de rar.
                2. Modérateur
                  Comme ça:
                  os.popen("cd \"") 

                  Ou mieux, les triples quotes:
                  os.popen("""cd \""") 
                  1. ok mais puisque j'ai quand meme besoin de cet antislash, comment outrepasser ce problème ?

                    merci pour votre aide
                    Steph70
                    1. Modérateur
                      Salut,

                      EOL = End of line

                      Il ne faut pas mettre d'antislash avant la guillemet fermante....