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 :

os.system et espace dans arguments sous windows


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Consultant en technologies
    Inscrit en
    Octobre 2013
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Octobre 2013
    Messages : 158
    Points : 555
    Points
    555
    Par défaut os.system et espace dans arguments sous windows
    Question simple,
    J'ai un script python qui rédige un fichier de paramètres pour un executable (à grand coup de line.replace()) puis appelle cet executable avec comme argument le nomdufichier tout marche bien lorsque le chemin du fichier de paramètres ne contiens pas d'espace...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TheExecutable ="\"C:\Program files\Executable\Executable.exe" 
    Parametersfile = E:\Data Machin Truc\Param1.dat"  #En Vrai Parametersfile est une entrée utilisateur
    os.system(TheExecutable+" "+Parametersfile")
    Lance TheExecutable mais par contre l'argument est tronquée aux espaces.

    Comment passer des arguments contenant des espaces à un executable sous windows ? le tout à partir d'un script python.

    J'ai essayé avec subprocess qui me retourne juste des numéros d'erreurs windows sans me donner plus d'info sur le problème

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En fait, les guillemets doivent faire partie de la chaine envoyée. Il suffit donc d'entourer les chaines par des apostrophes EN PLUS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TheExecutable =r'"C:\Program files\Executable\Executable.exe"' 
    Parametersfile = r'"E:\Data Machin Truc\Param1.dat"'  #En Vrai Parametersfile est une entrée utilisateur
     
    print(TheExecutable + " " + Parametersfile)
    "C:\Program files\Executable\Executable.exe" "E:\Data Machin Truc\Param1.dat"
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre confirmé
    Profil pro
    Consultant en technologies
    Inscrit en
    Octobre 2013
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Octobre 2013
    Messages : 158
    Points : 555
    Points
    555
    Par défaut
    Salut Merci pour ta remarque, mais ca me débloque pas.

    Question idiote c'est quoi la différence entre
    "\"C:\\Program Files\\\""
    et '"C:\\Program Files\\"'

    J'ai refait quelques tests (La machine ou est installé l'executable est hors réseau et dans une autre salle, je peux donc pas copier-coller/transposer mon code ici)

    Si je fais
    os.system("\""+TheExecutable+"\" \""+Parametersfile+"\"")
    Et assimilé (single quote, raw strings etc...) Je me prend une erreur car C:\Program n'est pas un executable (si si )
    J'ai essayé d'éscaper les espace dans Parametersfile mais pour une raison mystérieuse la fonction string.replace me me transforme "\ " en r"\ " (c'est à dire que l'anti-slash est escapé)
    Une meilleure idée avant que je dise aux gens soit de passer leurs p... de machine sous Linux pour y faire du csh à la papy soit de pendre le gars qui met des espaces dans les chemins de fichier ?

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Sous Windows, il y a souvent des espaces dans les noms de fichiers, et la méthode que je t'ai proposé fonctionne parfaitement.

    Avec Python, les antislash sont exécutés par défaut. Pour éviter qu'ils ne le soient, soit on ajoute r avant le 1er guillemet, soit on les double. Ainsi, r"C:\Program files\Executable" donne la même chose que "C:\\Program files\\Executable".

    Par ailleurs, quand une chaine est entourée par des guillemets, les apostrophes sont des caractères normaux. Et l'inverse est vrai aussi!

    Donc, pour transmettre un guillemet dans la chaine, tu entoures la chaine avec des apostrophes.

    Ce sont des considérations de syntaxe Python qui n'ont rien à voir avec Windows ou Linux.

    As-tu essayé ce que je t'ai proposé?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/05/2009, 14h26
  2. Réponses: 7
    Dernier message: 08/02/2009, 10h59
  3. Réponses: 3
    Dernier message: 01/03/2008, 17h00
  4. Réponses: 2
    Dernier message: 20/02/2008, 20h12
  5. Insérer fichier pdf dans LaTeX sous Windows
    Par kawel dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 07/09/2006, 17h33

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