在logging.StreamHandler

我将python代码从Win10主机迁移到WS2012R2。令人惊讶的是,它无法正常运行,现在显示警告消息:“ UnicodeEncodeError:'charmap'编解码器无法对位置0-2处的字符进行编码:字符映射到“

我尝试执行命令:

set PYTHONLEGACYWINDOWSSTDIO=yes

我的代码:

import logging
import sys

def get_console_handler():
    console_handler = logging.StreamHandler(sys.stdout)
    return console_handler


def get_logger():
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    logger.addHandler(get_console_handler())
    return logger


my_logger = get_logger()
my_logger.debug("Это отладочное сообщение".encode("cp1252"))

我应该怎么做才能摆脱此警告?

更新 同事,很抱歉误导您!经过长时间的错误跟踪,我显然很累) 该问题与“ * .encode()”调用无关,它与IO控制台操作时的默认python编码有关(我想是这样)!原始代码从cp1251字符集中的数据库发出了一些请求,但是当python尝试将其转换为cp1252时出现了问题。

这是如何召唤错误的另一个示例。

  1. 使用文本“Этоотладочноесообщение”创建纯文本文件(即test.txt)并将其保存为cp1252。
  2. 运行python控制台并输入: f = open("test.txt") f.read()

输出:

f = open("test.txt")
f.read()
Traceback (most recent call last):   File "<stdin>",line 1,in <module>
File "c:\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 29: character maps to <undefined>
wellen2oo3 回答:在logging.StreamHandler

问题是logging.StreamHandler如何执行控制台输出,即由于与FileHandler相反,您无法更改默认编码。 如果默认的系统编码与所需的编码不匹配,则可能会遇到问题。

以我为例。我想输出cp1251行,而系统默认编码为:

import locale
locale.getpreferredencoding()

“ cp1252”

此问题已通过更改系统区域设置来解决(请参见https://stackoverflow.com/a/11234956/9851754)。对于非Unicode程序,选择“更改系统区域设置...”。无需更改代码。

import locale
locale.getpreferredencoding()

'cp1251'

,

使用encode(“ utf-8”)。以下是python编码的列表:https://docs.python.org/2.4/lib/standard-encodings.html

my_logger.debug("Это отладочное сообщение".encode("utf-8"))

然后使用.decode(“ utf-8”)查看字符串的可打印值

,

我已经用Python 3.6.8测试了您的代码,并且对我有用(我什么都没做)。

Python 3.6.8:

>>> python3 -V
Python 3.6.8
>>> python3 test.py 
Это отладочное сообщение

但是,当我用Python 2.7.15+测试它时,我遇到了与您类似的错误。

Python 2.7.15+及其实现:

>>> python2 -V
Python 2.7.15+
>>> python2 test.py 
  File "test.py",line 17
SyntaxError: Non-ASCII character '\xd0' in file test.py on line 17,but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

然后,将以下行放入对我有用的第一行中。

代码乞求:

# -*- coding: utf-8 -*-
import logging
import sys
...

使用Python 2.7.15+和修改后的代码输出:

>>> python2 -V
Python 2.7.15+
>>> python2 test.py 
Это отладочное сообщение
本文链接:https://www.f2er.com/3141872.html

大家都在问