2010-09-28 3 views
3

У меня есть программа, которая генерирует следующий вывод:Python Юникода POPEN или Popen ошибка чтения юникода

   ┌───────────────────────┐ 
      │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 
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ 

Это, кажется, не форматировать прямо на этом сайте, но нижние строчки в верхней части и верхней строки в нижнем случае приводят к ошибке в unicode.

Вот пример кода для 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│ 
      └───────────────────────┘ 

>>> 

Вот то же самое для 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) 

Любые идеи, если это может быть сделано, чтобы работать без большого количества " под капотом "работать? Я просто изучаю программирование и начинаю с python

+0

Не знаю, почему форматирование отключено. Мои извинения. – narnie

ответ

2

Я бы сказал, что запуск вашей программы из консоли должен работать корректно, потому что Python может угадать консольную кодировку окна терминала (cp437 в Windows Windows), но при запуске pipe Python использует значение по умолчанию ascii. Попробуйте изменить свою программу encode весь вывод Unicode в явном кодировании, например:

печати (upper_line * LEN) .encode («cp437»)

Затем, когда вы читаете его из трубы, вы можете либо decode Вернитесь в Юникод или распечатайте его непосредственно на терминале.

+0

К сожалению, он не работает на консоли. С консоли python, как только один из них запускает popen. Я думаю, что вы заметили о том, что труба по умолчанию не установлена. Думаю, нет никакого способа изменить это поведение. Очень жаль. Это хорошая идея, как вы предлагаете. Я отдам его. – narnie

+0

Так и сделал трюк. Спасибо за отличную идею о работе. Я думаю, если бы это была другая программа, и у меня не было источника, и это был двоичный код, не было бы никакого способа обойти это, а? – narnie

+2

Когда исходная программа Python, вы можете использовать 'os.environ ['PYTHONIOENCODING'] = 'utf-8'' перед' Popen'. Эта переменная среды указывает python использовать UTF-8 как значение по умолчанию вместо ASCII. Все символы Unicode могут быть отправлены с этой кодировкой ... просто '.decode ('utf-8')' полученный результат, чтобы вернуться в Unicode. –