已部署Python应用程序中的Unicode错误
我有一个简单的python/pyqt应用程序,它将数据插入SQLITE数据库表, 有些条目包含特殊字符,例如umlauts。 我使用eclipse进行了开发,对其进行了测试,并成功地插入了所有数据,没有任何错误。 然后我决定为我的应用程序创建一个可执行文件。我正在使用py2exe创建可执行文件。我的setup.py如下所示已部署Python应用程序中的Unicode错误,python,eclipse,sqlite,python-2.7,unicode,Python,Eclipse,Sqlite,Python 2.7,Unicode,我有一个简单的python/pyqt应用程序,它将数据插入SQLITE数据库表, 有些条目包含特殊字符,例如umlauts。 我使用eclipse进行了开发,对其进行了测试,并成功地插入了所有数据,没有任何错误。 然后我决定为我的应用程序创建一个可执行文件。我正在使用py2exe创建可执行文件。我的setup.py如下所示 from distutils.core import setup import py2exe import os includes=["sqlite3","sip","PyQ
from distutils.core import setup
import py2exe
import os
includes=["sqlite3","sip","PyQt4", "PyQt4.QtGui"]
excludes=[]
packages=[]
dll_excludes=['libgdk-win32-1.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', 'tk84.dll']
setup(
options={"py2exe": {"compressed": 2,
"optimize": 2,
"includes": includes,
"excludes": excludes,
"packages": packages,
"dll_excludes": dll_excludes,
"bundle_files": 2,
"dist_dir": "dist",
"xref": False,
"skip_archive": False,
"ascii": False,
"custom_boot_script": '',
}
},
windows=['MainWindow.py'],
)
只要我在“dist”文件夹中得到一个可执行的应用程序,它就可以工作,当我运行它时,它可以很好地加载,当我插入相同的数据时,它会在特殊字符(umlauts)处崩溃。在我成功插入的100个条目中有60个,第一次出现重音字符会导致可执行文件出现错误消息
(,UnicodeEncodeError('ascii',
u'Citro\xebnCX',5,6',序号不在范围内(128),)
碰巧我把雪铁龙X插入了表格中,“e”是带法国口音的字符
我不知道为什么在eclipse环境中运行python/pyqt应用程序时没有出现错误,但一旦创建了一个可执行文件,就会出现这个错误
我应该在安装文件中做哪些更改
谢谢我应用了这个解决方案
def setencoding():
encoding = "ascii"
if 0:
import locale
loc = locale.getdefaultlocale()
if loc[1]:
encoding = loc[1]
if 0: #changes comes here, change 0 to 1
encoding = "undefined" #the encoding you want
if encoding != "ascii":
sys.setdefaultencoding(encoding)
这对我很有效。不是一个原始的解决方案,在上看到它,所以不同之处在于不同环境选择的默认编码。Unicode到stdin或stdout的任何I/O都将触发使用默认编码的编码或解码。如果该编码是
'ascii'
,则任何重音字符都将失败
您可以检查默认值以确保:
import sys
sys.getdefaultencoding()
sys.stdin.encoding
sys.stdout.encoding
要从等式中排除
py2exe
,可以尝试在控制台中运行python MainWindow.py
,并将其与python MainWindow.py>输出进行比较。前者可能成功,而后者可能失败。在系统范围的site.py中手动修改预定义的setencoding()
函数是一个可怕的想法。它改变了所有python脚本在系统上的工作方式,只是偶尔会破坏它们。许多脚本都不希望您进行更改。对程序中的随机破坏进行故障排除是一场噩梦,您甚至不知道这些程序是用Python实现的。不要这样做。改为修复代码。如果你不知道怎么做,谢谢。你的回答让我走上了正确的轨道。我最终研究了如何在Python中设置默认编码(setdefaultencoding()函数不存在)?