2

У меня есть автомасштабируемый экземпляр AWS. На AMI для этого экземпляра, у меня есть файл myfile.py, содержащий следующую строку:Ошибка кодирования Python? UnicodeDecodeError: кодек ascii не может декодировать байтовый порядковый номер не в диапазоне (128)

X5ZΠ

В моей AWS CloudFormation, LaunchConfiguration, я UserData, который выполняет следующую инструкцию питона, когда экземпляр раскручивается. Он просто читает myfile.py и пытается заменить все вхождения регулярного выражения "X \ DZ" с "XYZ":

myString = "XYZ".join(re.compile('X\d\Z').split(open("myfile.py", "r").read())) 

, который производит эту ошибку:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 4: ordinal not in range(128) 

Okay. Я понимаю, что символ Œ вызывает проблемы, поскольку он не является ASCII. Но когда я вручную запускаю один и тот же оператор из оболочки python, он отлично работает, не бросая никаких исключений.

Как заставить скрипт, запускаемый пользовательскими данными AWS LaunchConfig, иметь такое же поведение, как и при его запуске вручную? Какую кодировку я должен установить и как ее установить?

+0

Вы используете 'from __future__ import unicode_literals' в этом модуле? –

+1

Какая версия Python? – cdarke

+0

@cdarke: почти наверняка Python 2, поскольку это подразумевает неявное декодирование с использованием ASCII. –

ответ

1

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

Python пытается принудить обоих к тому же, чтобы иметь возможность работать на нем. Лучше всего, если вы конвертируете оба в unicode. Для строковых литералов просто добавьте u, например: u"XYZ". Для файла вы должны указать python кодировку, если вы этого не сделаете, он по умолчанию принимает ascii. Попробуйте:

myString = u"XYZ".join(re.compile(u'X\d\Z').split(
    open("myfile.py", "r").read().decode('utf-8'))) 

в этой версии я использовал utf-8, который имеет некоторую вероятность быть правым. Если вы знаете, что это другое, вам нужно будет заменить его на right one (ваш редактор, в котором вы сохранили файл, вероятно, скажет вам).

EDIT: Я удалил часть о настройках консоли и среды, которые не применяются, как упоминалось в @Martijn. Он также прав, что эта ошибка воспроизводится только в том случае, если ваши строковые литералы : уже неявно unicode (from __future__ import unicode_literals) - в этом случае нет необходимости добавлять строковые литералы с помощью u.

+0

Проблема заключается в смешении строк Unicode и байтов. OP не показал полную трассировку и не подтвердил, действительно ли какая-либо из строк является unicode. Кажется, что не было взаимодействия с консолью (без печати и без чтения). –

+0

Часть о взаимодействии с консолью, где OP говорит «вручную запустить тот же оператор из оболочки python, он отлично работает, не бросая никаких исключений». – knitti

+0

@Martijn, я отредактировал свой ответ, чтобы лучше отразить проблему со строковыми литералами, спасибо – knitti

Смежные вопросы

 Смежные вопросы