Почему я получаю ошибку кодирования в Python warnings.formatwarning на строке формата?

Имейте Вас, попробовал

ssh -t remotemachine <some command>

опция т из ssh страницы справочника:

 -t      Force pseudo-tty allocation. This can be used to execute 
         arbitrary screen-based programs on a remote machine, which
         can be very useful, e.g. when implementing menu services.
         Multiple -t options force tty allocation, even if ssh has no local tty.

вместо

 -f      Requests ssh to go to background just before command execution.  
         This is useful if ssh is going to ask for passwords or passphrases, 
         but the user wants it in the background.
         This implies -n.  The recommended way to start X11 programs at a remote
         site is with something like ssh -f host xterm.
5
задан 6 October 2009 в 08:21
поделиться

3 ответа

Это происходит, когда Python пытается принудить аргумент:

s = u"\u00fc"
print str(s)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 0: ordinal not in range(128)

Это происходит потому, что один из ваших аргументов является объектом (а не строкой любого типа) и Python вызывает str () на нем. Есть два решения: используйте строку Unicode для формата ( s = u "% s ..." ) или заключите каждый аргумент в repr () .

.
8
ответ дан 18 December 2019 в 09:51
поделиться

Вы смешиваете объекты Unicode и str.

Пояснение: В Python 2.x есть два типа объектов, которые могут содержать текстовые строки. str и юникод. str - это строка байтов, поэтому она может содержать только символы от 0 до 255. Unicode - это строка символов Unicode.

Вы можете преобразовать между str и unicode с помощью методов "encode" и "decode":

>>> "thisisastring".decode('ascii')
u'thisisastring'

>>> u"This is ä string".encode('utf8')    
'This is \xc3\xa4 string'

Обратите внимание на кодировки. Кодировки - это способы представления текста в Юникоде только в виде строк байтов.

Если вы попытаетесь сложить str и unicode вместе, Python попытается преобразовать одно в другое. Но по умолчанию он будет использовать ASCII в качестве кодировки, что означает az, AZ и некоторые дополнительные символы, такие как ! "# $% & / () =? '{[]]} и т. Д. Ошибка.

В этот момент вы получите либо ошибку кодирования, либо ошибку декодирования, в зависимости от того, пытается ли Python преобразовать Unicode в str или str в unicode. Обычно он пытается декодировать, то есть конвертировать в unicode. Но иногда он решает не заставлять, а принудительно использовать строку. Я не совсем уверен, почему.

Обновление: Причина, по которой вы получаете ошибку кодирования, а не ошибку декодирования выше, заключается в том, что сообщение в приведенном выше коде не является ни str, ни unicode. Это еще один объект, у которого есть метод str . Таким образом, Python выполняет str (message) перед его передачей, и это не удается, поскольку внутренне хранимое сообщение представляет собой объект Unicode, который нельзя принудительно преобразовать в ascii.

Или, проще говоря: он не работает, потому что warnings.warn ( ) не принимает сообщения Unicode.

Теперь решение:

Не смешивайте str и unicode. Если вам нужно использовать юникод, а вы, очевидно, это делаете, постарайтесь, чтобы все строки всегда были в юникоде. Это единственный способ избежать этого. Это означает, что всякий раз, когда вы читаете строку с диска или вызываете функцию, которая может возвращать что-либо, кроме чистой ascii str, И когда вам нужно сохранить его на диск или отправить по сети, или передать его методу, который не понимает Unicode, кодируйте его в str как можно позже.

В этом конкретном случае проблема в том, что вы передайте unicode в warnings.warn (), и вы не можете этого сделать. Передайте строку. Если вы не знаете, что это такое (как, похоже, здесь), потому что оно пришло откуда-то еще, ваши решения try / except с repr работают нормально, хотя выполнение кодирования было бы возможным.

8
ответ дан 18 December 2019 в 09:51
поделиться

Один из переданных вами операндов не подходит для кодировки ASCII - возможно, он содержит символы Unicode или Latin-1. Измените строку формата на Unicode и посмотрите, что произойдет.

1
ответ дан 18 December 2019 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: