2016-08-24 195 views
4

下面的程序觸發我的Windows 10計算機上的UnicodeEncodeError(運行Python 3.5.2),但在我的Linux計算機上運行Python 3.3.2時沒有任何錯誤。Python程序在Windows上失敗,但在Linux上不能運行

#!/usr/bin/python 
import logging 
str ="Antonín Dvořák" 
logging.basicConfig(filename='log.txt', level=logging.INFO) 
logging.info(str) 

在Linux上,日誌文件正確包含:

INFO:root:Antonín Dvořák 

在Windows上,我得到以下錯誤:在什麼可能的原因可能是

enter image description here

任何想法對於這種差異?

+1

的可能的複製[蟒UTF-8編碼拋出的UnicodeDecodeError儘管 「錯誤= '替換'」](http://stackoverflow.com/questions/31299828/python-utf-8-encoding-throws-unicodedecodeerror -despite-errors-replace) – randomusername

+0

這似乎是一個不同的問題,尤其是,在Python 2上編碼/解碼的問題。 – Anthony

+0

哦!你是對的,我必須點擊錯誤的副本 – randomusername

回答

3

而不是一個文件名,你可以通過一個流,其編碼規定:

logging.basicConfig(
    stream=open('log.txt', 'w', encoding='utf-8'), 
    level=logging.INFO 
) 

至於原因,它可能是試圖利用當前區域的編碼(CP1252打開目標文件時,通過判斷堆棧跟蹤)。

4

Windows的缺省編碼(在你的情況下是cp1252)與Linux(通常是utf8)不同,所以你必須指定你想要的編碼。

下面的代碼在Python 3.3中沒有工作(仍然使用cp1252),但是使用了3.5,所以它看起來像3.3中的一個bug。我使用utf-8-sig,因爲許多Windows文本編輯器默認爲沒有UTF-8 BOM簽名的ANSI編碼(例如cp1252)。

import logging 
str ="Antonín Dvořák" 
with open('log.txt','w',encoding='utf-8-sig') as s: 
    logging.basicConfig(stream=s, level=logging.INFO) 
    logging.info(str) 
相關問題