Python: проблемы с кодировкой в ​​Windows (библиотека построения боке)

Я пытаюсь воспроизвести простейшие примеры из учебника по боке на 64-разрядной версии Windows. машина с Python 3.3.0.

Вот код полностью

import pandas as pd
import numpy as np
import matplotlib.pyplot as mpl

# NOTE need this import as output_file was not getting imported into the 
#     global namespace
import bokeh.plotting as bkp
from bokeh.plotting import *

# Skip the first point because it can be troublesome
theta = np.linspace(0, 8*np.pi, 10000)[1:]

# Compute the radial coordinates for some different spirals
lituus = theta**(-1/2)          # lituus
golden = np.exp(0.306349*theta) # golden
arch   = theta                  # Archimedean
fermat = theta**(1/2)           # Fermat's

# Now compute the X and Y coordinates (polar mappers planned for Bokeh later)
golden_x = golden*np.cos(theta)
golden_y = golden*np.sin(theta)
lituus_x = lituus*np.cos(theta)
lituus_y = lituus*np.sin(theta)
arch_x   = arch*np.cos(theta)
arch_y   = arch*np.sin(theta)
fermat_x = fermat*np.cos(theta)
fermat_y = fermat*np.sin(theta)

# output to static HTML file
bkp.output_file("lines.html")

# Plot the Archimedean spiral using the `line` renderer. Note how we set the
# color, line thickness, title, and legend value.
line(arch_x, arch_y, color="red", line_width=2, title="Archimean", legend="Archimedean")

Это дает мне следующую ошибку:

Traceback (most recent call last):
  File "F:\programming\python\python64\python33\lib\site-packages\IPython\core\interactiveshell.py", line 2732, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-1-00be3b4eba05>", line 1, in <module>
    bkp.line(arch_x, arch_y, color="red", line_width=2, title="Archimean", legend="Archimedean")
  File "F:\programming\python\python64\python33\lib\site-packages\bokeh\plotting.py", line 318, in wrapper
    save()
  File "F:\programming\python\python64\python33\lib\site-packages\bokeh\plotting.py", line 284, in save
    f.write(html)
  File "F:\programming\python\python64\python33\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1831286-1831289: character maps to <undefined>

Я понимаю, что это как-то связано с кодировкой, которую Python использует для записи в выходной файл, но недостаточно знаю о настройке кодировки выходного файла или кодировки, которая используется Python для записи, чтобы исправить это. Помощь приветствуется.

Редактировать:

Я попытался реализовать совет, данный здесь, чтобы всегда передавать вывод stdout через потоковый генератор:

if sys.stdout.encoding != 'UTF-8':
    sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer, 'strict')
if sys.stderr.encoding != 'UTF-8':
    sys.stderr = codecs.getwriter('utf-8')(sys.stderr.buffer, 'strict')

но часть интерфейса, похоже, изменилась, и нет переменной sys.stdout.encoding.

Traceback (most recent call last):
  File "F:\programming\python\python64\python33\lib\site-packages\IPython\core\interactiveshell.py", line 2732, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-1-e12310bc7a07>", line 1, in <module>
    if sys.stdout.encoding != 'UTF-8':
  File "F:\programming\python\python64\python33\lib\codecs.py", line 387, in __getattr__
    return getattr(self.stream, name)
AttributeError: '_io.FileIO' object has no attribute 'encoding'

person tchakravarty    schedule 06.06.2014    source источник
comment
Ваша проблема не связана с sys.stdout, но если вы хотите заменить ее в Python 3, используйте sys.stdout = io.TextIOWrapper(sys.stdout.detach(), 'utf-8', 'strict').   -  person Eryk Sun    schedule 06.06.2014
comment
bokeh.plotting.save не устанавливает кодировку для файла . Он использует значение по умолчанию из locale.getprefferedencoding. Боюсь, чтобы использовать это, вам понадобится либо обезьяний патч bokeh.plotting, либо locale (_bootlocale в 3.4).   -  person Eryk Sun    schedule 06.06.2014
comment
@eryksun Хм, я искал getprefferedencoding в каталоге боке, и, похоже, он не использовался. Можете ли вы указать мне строки кода, где я могу явно установить кодировку вывода?   -  person tchakravarty    schedule 06.06.2014
comment
open(filename, "w") неявно использует getprefferedencoding, если вы не указали явный encoding, такой как open(filename, "w", encoding="utf-8").   -  person Eryk Sun    schedule 06.06.2014
comment
@eryksun Так что просто добавьте опцию encoding='utf-8'?   -  person tchakravarty    schedule 06.06.2014
comment
@eryksun Да, теперь я пытаюсь найти строки, которые нужно изменить. Помощь приветствуется. :)   -  person tchakravarty    schedule 06.06.2014
comment
@eryksun Спасибо за указатель, нашел. Интересно, почему это не вариант для output_file.   -  person tchakravarty    schedule 06.06.2014
comment
@eryksun Кроме того, если вы разместите свой комментарий в качестве ответа, я приму его.   -  person tchakravarty    schedule 06.06.2014
comment
У меня возникли проблемы с воспроизведением этой проблемы на виртуальной машине Windows 8. Не могли бы вы предоставить дополнительную информацию здесь (или в выпуске GH ниже) о том, что такое локаль вашей системы и т. д.?   -  person bigreddot    schedule 06.06.2014
comment
@bigreddot, трассировка показывает кодовую страницу 1252. getpreferredencoding вызывает _locale._getdefaultlocale, который вызывает Windows API GetACP.   -  person Eryk Sun    schedule 06.06.2014
comment
Хорошо, как я могу настроить компьютер с Windows 8 для использования cp1252? Я ничего не вижу в настройках языка/локали. Спасибо   -  person bigreddot    schedule 07.06.2014
comment
@bigreddot, в Windows 7 изменение языкового стандарта системы находится на административной вкладке для настроек региона и языка. Вы можете проверить текущее значение, используя ctypes: import ctypes; print(ctypes.windll.kernel32.GetACP()).   -  person Eryk Sun    schedule 07.06.2014
comment
Похоже, он уже использует cp1252, поэтому я не уверен, почему мы не можем воспроизвести это: В [1]: import ctypes; печать (ctypes.windll.kernel32.GetACP()) 1252   -  person bigreddot    schedule 07.06.2014


Ответы (2)


Я открыл задачу для отслеживания этой проблемы: https://github.com/ContinuumIO/bokeh/issues/682

Как вы обсудили с eryksun, кажется, это легко поправимо.

Я буду держать вас в курсе здесь, но если вы хотите принять участие в выпуске, пожалуйста.

Ваше здоровье

person Damian Avila    schedule 06.06.2014
comment
Поскольку вы решили это на github, я отмечаю этот ответ как принятый. Интересное заигрывание с wontfix, однако. - person tchakravarty; 17.09.2014

fg nu,

Мы не можем воспроизвести проблему на наших платформах win... не могли бы вы присоединиться к нам в открытой проблеме: https://github.com/ContinuumIO/bokeh/issues/682, чтобы получить дополнительную информацию о вашей настройке и архитектуре?

Мы будем очень признательны, если вы предоставите нам больше информации, чтобы воспроизвести проблему и получить быстрое решение.

Спасибо.

Дамиан

person Damian Avila    schedule 06.06.2014
comment
Я попробовал это в Windows с cp1252, и это сработало без ошибок. По какой-то причине вывод fg nu содержит символ, который не может быть закодирован в cp1252. Но на самом деле ограничение 8-битной кодовой страницей с 250 символами — это прямо из прошлого века. Выходному файлу нужна опция для установки кодировки и межплатформенное значение по умолчанию UTF-8. - person Eryk Sun; 07.06.2014
comment
В настоящее время мы обсуждаем этот вопрос. Необязательная кодировка может быть проблематичной, потому что контент Bokeh не может быть закодирован со всеми доступными параметрами кодирования. Но мы оцениваем возможность по умолчанию использовать UTF-8, как вы упомянули. - person Damian Avila; 07.06.2014