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 :

Escape character dans un subprocess


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Scrum master
    Inscrit en
    Décembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Scrum master

    Informations forums :
    Inscription : Décembre 2016
    Messages : 4
    Par défaut Escape character dans un subprocess
    Bonjour,

    ceci est ma première question dans ce forum, je vais essayer d'être aussi explicite que possible.

    J'utile py.test pour tester des fonctionnalités d'une board sous linux. Je suis sous python 2.7.6

    Pour certains tests je dois appeler une commande linux. Je construis ma ligne dans commande dans python, puis je l'exécute avec un run_cmd qui ouvre un subprocess.
    Cette méthode fonctionne dans la plupart des cas.

    Par contre, le cas suivant ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MonTest():
     
       	def test_x_y(self):
           			cmd_line = 'linux_shell_command -o '
    			print "\ncommand line: " + cmd_line
    			cmd_line += '"'
    			print "\ncommand line: " + cmd_line
     
    			#Ajout d'autres options pour compléter cmd_line
     
    			output, status = run_cmd(cmd_line)
    A l'exécution, j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    linux_shell_command -o \"video...
    Error parsing option -o
    
    En clair, l'escape character de mes options est interprété littéralement par ma commande en shell. Et ce, quel que soit le formatage de cmd_line.

    J'ai essayé diverses méthodes pour supprimer cet \, sans succès. cmd_line est de type str.

    Voyez-vous une cause possible de cette erreur?

    Merci d'avance

  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,

    L'escape est introduit dans les lignes de code que tu ne montres pas ...

    Utilise les balises [code] que l'on y voie plus clair, merci.

  3. #3
    Candidat au Club
    Homme Profil pro
    Scrum master
    Inscrit en
    Décembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Scrum master

    Informations forums :
    Inscription : Décembre 2016
    Messages : 4
    Par défaut Correction typo
    Une petite correction sur de la typo, j'ai simplifié le code pour publier sur le forum, mais du coup ce n'était pas consistant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class MonTest():
     
        def test_x_y(self):
                cmd_line = 'linux_shell_command -o '
                print "\ncommand line: " + cmd_line
                cmd_line += '"'
                print "\ncommand line: " + cmd_line
     
                run_cmd(cmd_line)
    A l'exécution, ça donne

    command line: linux_shell_command -o
    command line: linux_shell_command -o \"

    ...

    Error initializing: Error parsing option -o

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 710
    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 710
    Par défaut
    Salut,

    Citation Envoyé par denipropetrovsk Voir le message
    Une petite correction sur de la typo, j'ai simplifié le code pour publier sur le forum, mais du coup ce n'était pas consistant.
    C'est bien de simplifier le code mais si ce que vous postez n'est pas cohérent les affichages, on ne va pas pouvoir comprendre grand chose (sinon que le problème est "ailleurs").

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Scrum master
    Inscrit en
    Décembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Scrum master

    Informations forums :
    Inscription : Décembre 2016
    Messages : 4
    Par défaut
    Le morceau de code que je publie est a priori suffisant, j'ai juste supprimé deux self.

    Le problème est que quand j'ajoute un double quote à ma ligne de commande, quelle que soit la méthode, un caractère d'échappement est ajouté. Ca semble normal. Par contre ce qui n'est pas attendu est que ce caractère d'échappement soit interprété lorsque j'insère la ligne de commande construite dans un subprocess.

    Voici ma méthode run_cmd, mais je doute que ce soit là que ce se trouve le problème:

    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
    37
     
    #==========================================================================================================================
    def run_cmd(command, timeout=10, block=True, shell=False, display=True):
    	"""
            Execute commands in array.
     
            INPUT
                    command_split: Command to execute in array
                    timeout: specifies the number of seconds to wait for end of command then returns
                    block:  if True, command is killed after timeout has expired
                                    if false, command runs to completion is a daemonized thread
                    shell_bool = enable shell
            OUTPUT
                    tupple (Unix output lines, return code)
                            Output: if block mode, return output line of your command
                                            if handle mode, return handle create by subprocess.Popen
                            Unix return code: None if command is still running, < 0 if killed by signals, >= 0 for exit codes
     
            """
    	command_split = command.split(" ")
    	try:
    		if display:
    			print("\tRun command: %s" %repr(command))
    		subproc = subprocess.Popen(args=command_split, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=shell, universal_newlines=True)
     
    	except OSError, err:
    		print("\tCommand failed: %s " %str(err))
    		return "", -1
     
    	if not block:
    		# Run as handle
    		subproc.poll()
    		return (str(subproc), subproc.returncode)
     
    	else:
    		# block mode
    		return run_block_mode(subproc, command, timeout=timeout)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 710
    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 710
    Par défaut
    Citation Envoyé par denipropetrovsk Voir le message
    Le morceau de code que je publie est a priori suffisant, j'ai juste supprimé deux self.

    Le problème est que quand j'ajoute un double quote à ma ligne de commande, quelle que soit la méthode, un caractère d'échappement est ajouté. Ca semble normal.
    Je ne vois pas pourquoi Python ajouterait un caractère d’échappement avant un double quote.
    D'ailleurs, sur Linux et Windows, il ne le fait pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> cmd_line = 'linux_shell_command -o '
    >>> print "\ncommand line: " + cmd_line
     
    command line: linux_shell_command -o 
    >>> cmd_line += '"'
    >>> print "\ncommand line: " + cmd_line
     
    command line: linux_shell_command -o "
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Candidat au Club
    Homme Profil pro
    Scrum master
    Inscrit en
    Décembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Scrum master

    Informations forums :
    Inscription : Décembre 2016
    Messages : 4
    Par défaut
    Effectivement dans ma console Linux PC, il ne le fait pas.

    J'ai essayé diverses méthodes pour ajouter le double quote, jouer sur l'encodage, ajouter un raw string, ça ne change rien.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 710
    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 710
    Par défaut
    Citation Envoyé par denipropetrovsk Voir le message
    Effectivement dans ma console Linux PC, il ne le fait pas.

    J'ai essayé diverses méthodes pour ajouter le double quote, jouer sur l'encodage, ajouter un raw string, ça ne change rien.
    Convaincu que le problème n'est pas là où vous regardez (et dans ce que vous montrez)?

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

  9. #9
    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,

    Si c'est sous Windows, je suggère de regarder la note "17.1.5.1. Converting an argument sequence to a string on Windows" de la doc du module subprocess:

    https://docs.python.org/2/library/su...ing-on-windows

    Il y a apparemment une conversion des chaines passées en argument pour les adapter à la syntaxe MS.
    Peut-être qu'un guillemet, qui est un séparateur, doit être échappé lorsqu'il est présenté tout seul pour être considéré alors comme un caractère normal?

    C'est fou ce qu'on trouve dans la doc...

Discussions similaires

  1. Enter / escape / delete dans la datagrid
    Par faldo1 dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 19/03/2010, 01h14
  2. Cancel event sur Escape Key dans datagridview
    Par garciajulien dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/02/2010, 20h32
  3. Illegal escape character
    Par piotrr dans le forum NetBeans
    Réponses: 1
    Dernier message: 28/09/2007, 09h53
  4. illegal escape character
    Par yli_ren dans le forum Langage
    Réponses: 6
    Dernier message: 19/06/2007, 17h31
  5. illegal escape character
    Par crocodile dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2006, 12h23

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