UnicodeEncodeError при использовании функции компиляции - PullRequest
5 голосов
/ 10 января 2012

Используя python 3.2 в Windows 7, я получаю следующее в IDLE:

>>compile('pass', r'c:\temp\工具\module1.py', 'exec')
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character

Кто-нибудь может объяснить, почему оператор compile пытается преобразовать имя файла в кодировке Unicode, используя mbcs?Я знаю, что sys.getfilesystemencoding возвращает «mbcs» в Windows, но я подумал, что это не используется, когда предоставляются имена файлов в Юникоде.

например:

f = open(r'c:\temp\工具\module1.py') 

работает.

Для более полного теста сохраните следующее в кодированном файле utf8 и запустите его, используя стандартный python.exe версии 3.2

# -*- coding: utf8 -*-
fname = r'c:\temp\工具\module1.py'
# I do have the a file named fname but you can comment out the following two lines
f = open(fname)
print('ok')
cmp = compile('pass', fname, 'exec')
print(cmp)

Вывод:

ok
Traceback (most recent call last):
  File "module8.py", line 6, in <module>
    cmp = compile('pass', fname, 'exec')
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: inval
id character

Ответы [ 3 ]

5 голосов
/ 10 января 2012

Из Python, выпуск 10114 , кажется, что логика заключается в том, что все имена файлов, используемые Python, должны быть действительными для платформы, где они используются. Он закодирован с использованием кодировки файловой системы, которая будет использоваться во внутренних элементах C Python.

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

1 голос
/ 13 ноября 2012

Вот решение, которое сработало для меня: Проблема 427: UnicodeEncodeError: кодек «ascii» не может кодировать символы в позиции 1-6: порядковый номер не в диапазоне (128) :

Если вы посмотрите файл справки PyScripter в разделе «Кодированные исходные файлы Python» (последний абзац), он расскажет вам, как настроить Python для поддержки других кодировок, изменив файл site.py.Этот файл находится в подкаталоге lib каталога установки Python.Найдите функцию setencoding и убедитесь, что включена поддержка кодировки строки по умолчанию для поддерживаемой локали.(см. ниже)

def setencoding():
  """Set the string encoding used by the Unicode implementation.  The
  default is 'ascii', but if you're willing to experiment, you can
  change this."""
  encoding = "ascii" # Default value set by _PyUnicode_Init()
  if 0:  <<<--- set this to 1 ---------------------------------
      # Enable to support locale aware default string encodings.
      import locale
      loc = locale.getdefaultlocale ()
      if loc[1]:
          encoding = loc[1]
  if 0:
      # Enable to switch off string to Unicode coercion and implicit
      # Unicode to string conversion.
      encoding = "undefined"
  if encoding != "ascii":
      # On Non-Unicode builds this will raise an AttributeError...
      sys.setdefaultencoding (encoding) # Needs Python Unicode
build !
0 голосов
/ 04 июля 2017

Я думаю, что вы можете попытаться изменить "\" в пути к файлу на "/" , так же, как

compile ('pass', r'c: \ temp \ 工具 \ module1.py ',' exec ')

compile ('pass', r'c: / temp / 工具 /module1.py ',' exec ')

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...