【问题标题】:pycharm with codecs utf-8 encode from system stdout and stderr带有编解码器的 pycharm utf-8 从系统 stdout 和 stderr 编码
【发布时间】:2017-06-06 20:58:55
【问题描述】:

大家好,我正在 pycharm 社区版 2016.3.2 的一个项目中使用 python 3.6.0。每当我使用编解码器对输入流进行编码时,我的程序中就会出现这个奇怪的错误:

import codecs
import sys

sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

print("something")

问题是我的程序总是以退出代码 1 退出,这是控制台输出:

Traceback (most recent call last):
  File "C:/Users/jhonsong/Desktop/restfulAPI/findARestaurant.py", line 9, in <module>
    print("something")
  File "C:\Python36-32\lib\codecs.py", line 377, in write
    self.stream.write(data)
TypeError: write() argument must be str, not bytes

Process finished with exit code 1

但我的输入是一个字符串,为什么 codecs.write 认为我给它字节输入?

【问题讨论】:

  • 这听起来是个坏主意 - 并非所有控制台都支持 UTF-8。您应该打印并允许 Python 的语言环境检测计算出适当的编码
  • @AlastairMcCormack 我正在尝试完成这个在线课堂挑战:link,它随着foursquare 的API 和可能的多语言结果返回而发展。您建议将结果写入文件而不是控制台?
  • 我没有访问权限:(

标签: python python-3.x encoding utf-8


【解决方案1】:

在 Python 3 中,sys.stdout 是一个 Unicode 流。 codecs.getwriter('utf8') 需要一个字节流。 sys.stdout.buffer 是原始字节流,所以使用:

sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)
sys.stderr = codecs.getwriter('utf8')(sys.stderr.buffer)

但这对于 Python 3.6 来说似乎有点过头了,print 应该可以正常工作。通常,如果您需要强制编码,例如将 Python 脚本的输出捕获到特定编码的文件中,则以下脚本 (Windows) 可以工作。环境变量指示输出编码并覆盖终端默认值。

set PYTHONIOENCODING=utf8
python some_script.py > output.txt

由于您要提交到网站,该网站应该负责以能够正确捕获结果的方式运行您的脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2014-01-24
    • 2013-03-26
    • 2018-02-18
    相关资源
    最近更新 更多