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 :

commande shell avec Popen : problème d'accent


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut commande shell avec Popen : problème d'accent
    salut

    je voudrais réaliser une simple copie de fichier en lançant ma commande shell dans un subprocess.Popen.
    Le problème, c'est qu'un de mes utilisateurs s'appelle Noëlle, qu'il a un répertoire à son nom et que Popen plante quand je veux faire la copie.

    j'obtiens alors l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Traceback (most recent call last):
      File "C:\Documents and Settings\cyrull\Bureau\PDF\pdf2xls.pyw", line 641, in MonAppli
        reppdf2txt = self.pdf2txt()
      File "C:\Documents and Settings\cyrull\Bureau\PDF\pdf2xls.pyw", line 140, in pdf2txt
        p = subprocess.Popen(commande, shell = True)
      File "C:\Python25\lib\subprocess.py", line 594, in __init__
        errread, errwrite)
      File "C:\Python25\lib\subprocess.py", line 816, in _execute_child
        startupinfo)
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xeb' in position 87: ordinal not in range(128)
    qui est liée au ë. Si je remplace Noëlle par Noelle, plus de problème.
    Or, sur la même machine, si je vais directement dans l'invite de commande DOS, je n'ai aucun problème pour exécuter ma commande. En d'autres termes, c'est Popen et non DOS qui pose problème !

    voilà le code concerné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                commande = 'copy "' + self.FichierCopie + '"'
                p = subprocess.Popen(commande, shell = True)
                p.wait()
    Est-ce que quelqu'un voit d'où le problème peut venir sachant que j'ai aussi essayé unicode(commande) dans le Popen

    Merci d'avance pour votre aide

    Cyrull

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Ahhh les joies de l'encodage des caractères !!!

    Il faut que tu encodes le nom de tes fichiers en fonction de l'encodage utilisé par ton systè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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import subprocess
    import sys
     
    import locale
    encoding = locale.getpreferredencoding()
     
    if sys.platform == 'win32':
        console_encoding = 'cp850'
    elif sys.platform in ('linux2', 'darwin'):
        console_encoding = 'utf-8'
     
    commande = u'copy e:\\temp\\noëlle.txt e:\\temp\\eric.txt'.encode(encoding)
     
    print commande
    p = subprocess.Popen(commande, shell=True, stdout=subprocess.PIPE)
    p.wait()
     
    for l in p.stdout.readlines():
        print l.decode(console_encoding).encode(sys.stdout.encoding)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    il s'agit du chemin complet du fichier que je colle dans le répertoire courant de l'application.

    le chemin est donc :

    "C:\Documents and Settings\Noëlle\Mes Documents"

    que j'ai lu dans un wxTxtCtrl comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.FichierCopie = self.fichier.GetValue()
    Je n'ai pas d'encoding à ce niveau.

    Je tiens juste à ajouter que j'ai essayer de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = subprocess.Popen(unicode(commande), shell = True)
    ce qui n'a pas eu d'effet, et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = subprocess.Popen(commande.encode('utf-8', shell = True)
    ce qui a eu pour conséquence de modifier le chemin lu et de le rendre faux, ce qui a bien évidemment empéché la copie.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    merci DelphiManiac

    j'avais commencé à poster ma réponse avant que tu ne postes la tienne et je l'ai fini bien après (réunion impromptue)
    Mais c'était la bonne réponse. Il fallait utiliser .encode(locale.getpreferredencoding())

    Merci

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

Discussions similaires

  1. VBA & commande Shell avec paramètres
    Par lgab3 dans le forum VBA Access
    Réponses: 6
    Dernier message: 26/11/2009, 13h14
  2. Exécution de commandes SHELL avec SharpSSH
    Par belaidw dans le forum Services Web
    Réponses: 0
    Dernier message: 29/09/2009, 05h00
  3. commande shell avec gestion des erreurs
    Par nymus7 dans le forum Programmation et administration système
    Réponses: 0
    Dernier message: 06/08/2008, 13h59
  4. [vb6] commande shell avec un .msi
    Par sun19 dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 16/03/2008, 05h06

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