UnicodeDecodeError: код 'charmap' c не может декодировать байт 0x81 в позиции 73776 - PullRequest
0 голосов
/ 13 февраля 2020

Это Django проект. Обнаружена ошибка при запуске pip install -r requirements.txt в локальном virtualenv.

Collecting https://github.com/jedestep/Zappa/archive/layer-support.zip (from -r requirements\base.txt (line 9))
Using cached https://github.com/jedestep/Zappa/archive/layer-support.zip
ERROR: Command errored out with exit status 1:
     command: 'c:\users\user~1\desktop\project\project\venv\scripts\python.exe' -c 'import sys, setuptools, tokenize
    ; sys.argv[0] = '"'"'C:\\Users\\USER~1\\AppData\\Local\\Temp\\pip-req-build-6htw2gh2\\setup.py'"'"'; __file__='"'"'C:\
    \Users\\USER~1\\AppData\\Local\\Temp\\pip-req-build-6htw2gh2\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(
    __file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' e
    gg_info --egg-base 'C:\Users\USER~1\AppData\Local\Temp\pip-req-build-6htw2gh2\pip-egg-info'
         cwd: C:\Users\USER~1\AppData\Local\Temp\pip-req-build-6htw2gh2\
    Complete output (7 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\USER~1\AppData\Local\Temp\pip-req-build-6htw2gh2\setup.py", line 8, in <module>
        long_description = readme_file.read()
      File "c:\users\user~1\desktop\project\project\venv\lib\encodings\cp1252.py", line 23, in decode
        return codecs.charmap_decode(input,self.errors,decoding_table)[0]
    UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 73776: character maps to <undefined>
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

Требования устанавливаются, как и ожидалось, в бродячей среде, однако я напоминаю, что она также будет работать локально на моей машине. К сожалению, я не уверен, какие изменения привели к этой ошибке, возможно, это было результатом попытки.

Версии: Python: 3.6.5 Django: 2.2 pip: 20.0.2

Я запустил pip install --upgrade setuptools, но это не меняет ошибку. Подобная ошибка произойдет при автоматической загрузке тестовой базы данных c, когда я попытаюсь запустить tox.

. Любые идеи приветствуются. Спасибо.

1 Ответ

1 голос
/ 13 февраля 2020

Требования устанавливаются, как и ожидалось, в бродячей среде, однако я напоминаю, что она также будет работать локально на моей машине. К сожалению, я не уверен, какие изменения привели к этой ошибке, возможно, это было результатом извлечения.

Проблема связана с пакетом, который вы пытаетесь установить, и конфигурация вашей среды. Я предполагаю, что пакет обновился в один момент и сломался, потому что они добавили эмодзи в свой readme или что-то в этом роде: если вы немного посмотрите на сообщение об ошибке, вы увидите, что есть проблема при чтении материала в long_description, проверьте в настройке пакета .py и вы можете найти проблему в самом начале:

with open('README.md') as readme_file:
    long_description = readme_file.read()

Проблема здесь в том, что когда вы open файл без указания режима, это будет "текст", так что python автоматически декодирует байты в str, что круто, за исключением того, что endoding , который он использует для такого декодирования, является значением по умолчанию для системы (обнаруживается путем вызова locale.getpreferredencoding(False)), что часто не является желаемым .

Ваша среда Vagrant и машина разработчика, вероятно, имеют кодировку по умолчанию UTF8 (как в большинстве систем unix в наши дни), в то время как ваша локальная коробка windows не имеет и использует CP1252 по умолчанию, который взрывается. К сожалению, я не большой пользователь windows (для разработчиков), поэтому я понятия не имею, как изменить «кодировку по умолчанию», что может даже оказаться невозможным, учитывая то, что дает быстрый поиск SO.

Я бы предложил:

  • попросить автора пакета исправить их setup.py, чтобы явно указать encoding при открытии файла
  • , пытаясь узнать больше о getpreferredencoding внутренние решения, и возможно ли переопределить предпочтительное кодирование через среду в Windows (очевидно, возможно / легко переопределить кодировку для стандартного потока, но chcp / set PYTHONIOENCODING, очевидно, не ничего не делать для обычного open)
  • , работающего в подсистеме Windows для Linux, что, вероятно, будет работать из коробки

PS: Я позволил себе обновить теги вашего поста как django, pip и eggs действительно не имеют никакого отношения к актуальной проблеме

...