2010-09-28 7 views
3

J'ai un programme qui génère la sortie suivante:Python unicode popen ou erreur Popen lecture unicode

   ┌───────────────────────┐ 
      │10 day weather forecast│ 
      └───────────────────────┘ 
▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ 
Tonight Sep 27  Clear    54  0 % 
Tue Sep 28   Sunny    85/61 0 % 
Wed Sep 29   Sunny    86/62 0 % 
Thu Sep 30   Sunny    87/65 0 % 
Fri Oct 01   Sunny    85/62 0 % 
Sat Oct 02   Sunny    81/59 0 % 
Sun Oct 03   Sunny    79/56 0 % 
Mon Oct 04   Sunny    78/58 0 % 
Tue Oct 05   Sunny    81/61 0 % 
Wed Oct 06   Sunny    81/61 0 % 

Last Updated Sep 27 10:20 p.m. CT 
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ 

Cela ne semble pas bon format sur ce site, mais les lignes plus bas en haut et la partie supérieure les lignes au bas entraînent une erreur unicode.

Voici l'exemple de code pour os.popen

>>> buffer = popen('10day', 'r').read() 
Traceback (most recent call last): 
    File "/home/woodnt/python/10_day_forecast.py", line 129, in <module> 
    line_lower(51) 
    File "/home/woodnt/python/lib/box.py", line 24, in line_lower 
    print upper_line * len 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-50: ordinal not in range(128) 
>>> print buffer 

      ┌───────────────────────┐ 
      │10 day weather forecast│ 
      └───────────────────────┘ 

>>> 

est ici la même chose pour subprocess.Popen:

f = Popen('10day', stdout=PIPE, stdin=PIPE, stderr=PIPE) 
o, er = f.communicate() 
print o 

      ┌───────────────────────┐ 
      │10 day weather forecast│ 
      └───────────────────────┘ 

print er 
Traceback (most recent call last): 
    File "/home/woodnt/python/10_day_forecast.py", line 129, in <module> 
    line_lower(51) 
    File "/home/woodnt/python/lib/box.py", line 24, in line_lower 
    print upper_line * len 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-50: ordinal not in range(128) 

Toutes les idées si cela peut être fait de travailler sans beaucoup de " sous le capot "travail? Je suis en train d'apprendre la programmation et en commençant par python

+0

Je ne sais pas pourquoi le formatage est ainsi désactivé sur ce qui précède. Mes excuses. – narnie

Répondre

2

Je dirais que l'exécution de votre programme à partir de la console devrait fonctionner correctement car Python peut deviner le codage de la console de la fenêtre de terminal (cp437 sur Windows US), mais lorsqu'il est exécuté pipe Python utilise la valeur par défaut de ascii. Essayez de changer votre programme encode toutes les sorties Unicode à un codage explicite, par exemple:

impression (upper_line * len) .encode (« CP437 »)

Puis, quand vous lisez du tuyau, vous pouvez decode Retour à Unicode ou imprimez-le directement sur le terminal.

+0

Malheureusement, il rechigne à la console. Depuis une console python, dès que l'on excute le popen. Je pense que vous êtes sur le tuyau par défaut à ascii. Je suppose qu'il n'y a aucun moyen de changer ce comportement. Dommage. C'est une bonne idée de faire ce que vous suggérez. Je testerai. – narnie

+0

Cela a fait l'affaire. Merci pour cette excellente idée de travail. Je suppose que si c'était un autre programme et que je n'avais pas la source et que c'était un binaire, il n'y aurait aucun moyen de contourner ça, hein? – narnie

+2

Lorsque le programme source est Python, vous pouvez utiliser 'os.environ ['PYTHONIOENCODING'] = 'utf-8'' avant le' Popen'. Cette variable d'environnement indique à Python d'utiliser UTF-8 comme valeur par défaut au lieu de ASCII. Tous les caractères Unicode peuvent être envoyés avec ce codage ... juste '.decode ('utf-8')' la sortie reçue pour revenir à Unicode. –