Python 2.7 cx_freeze:删除我不需要的编码有啥风险?

Posted

技术标签:

【中文标题】Python 2.7 cx_freeze:删除我不需要的编码有啥风险?【英文标题】:Python 2.7 cx_freeze: What are the risks of removing the encodings that I dont need?Python 2.7 cx_freeze:删除我不需要的编码有什么风险? 【发布时间】:2015-02-17 14:27:57 【问题描述】:

当我对我的应用程序执行 cx_freeze 时,我会得到一个编码列表,如下所示:

m encodings.aliases
m encodings.ascii
m encodings.base64_codec
m encodings.big5
m encodings.big5hkscs
m encodings.bz2_codec
m encodings.charmap
m encodings.cp037
m encodings.cp1006
m encodings.cp1026
m encodings.cp1140
m encodings.cp1250
m encodings.cp1251
m encodings.cp1252
m encodings.cp1253
m encodings.cp1254
m encodings.cp1255
m encodings.cp1256
m encodings.cp1257
m encodings.cp1258
m encodings.cp424
m encodings.cp437
m encodings.cp500
m encodings.cp720
m encodings.cp737
m encodings.cp775
m encodings.cp850
m encodings.cp852
m encodings.cp855
m encodings.cp856
m encodings.cp857
m encodings.cp858
m encodings.cp860
m encodings.cp861
m encodings.cp862
m encodings.cp863
m encodings.cp864
m encodings.cp865
m encodings.cp866
m encodings.cp869
m encodings.cp874
m encodings.cp875
m encodings.cp932
m encodings.cp949
m encodings.cp950
m encodings.euc_jis_2004
m encodings.euc_jisx0213
m encodings.euc_jp
m encodings.euc_kr
m encodings.gb18030
m encodings.gb2312
m encodings.gbk
m encodings.hex_codec
m encodings.hp_roman8
m encodings.hz
m encodings.idna
m encodings.iso2022_jp
m encodings.iso2022_jp_1
m encodings.iso2022_jp_2
m encodings.iso2022_jp_2004
m encodings.iso2022_jp_3
m encodings.iso2022_jp_ext
m encodings.iso2022_kr
m encodings.iso8859_1
m encodings.iso8859_10
m encodings.iso8859_11
m encodings.iso8859_13
m encodings.iso8859_14
m encodings.iso8859_15
m encodings.iso8859_16
m encodings.iso8859_2
m encodings.iso8859_3
m encodings.iso8859_4
m encodings.iso8859_5
m encodings.iso8859_6
m encodings.iso8859_7
m encodings.iso8859_8
m encodings.iso8859_9
m encodings.johab
m encodings.koi8_r
m encodings.koi8_u
m encodings.latin_1
m encodings.mac_arabic
m encodings.mac_centeuro
m encodings.mac_croatian
m encodings.mac_cyrillic
m encodings.mac_farsi
m encodings.mac_greek
m encodings.mac_iceland
m encodings.mac_latin2
m encodings.mac_roman
m encodings.mac_romanian
m encodings.mac_turkish
m encodings.mbcs
m encodings.palmos
m encodings.ptcp154
m encodings.punycode
m encodings.quopri_codec
m encodings.raw_unicode_escape
m encodings.rot_13
m encodings.shift_jis
m encodings.shift_jis_2004
m encodings.shift_jisx0213
m encodings.string_escape
m encodings.tis_620
m encodings.undefined
m encodings.unicode_escape
m encodings.unicode_internal
m encodings.utf_16
m encodings.utf_16_be
m encodings.utf_16_le
m encodings.utf_32
m encodings.utf_32_be
m encodings.utf_32_le
m encodings.utf_7
m encodings.utf_8
m encodings.utf_8_sig
m encodings.uu_codec
m encodings.zlib_codec

但是在每个文件的顶部(甚至是 init.py)我都有以下内容:

# encoding: utf-8

这是否足以删除其余编码?通过排除列表手动排除它们是否有任何风险?

buildOptions = dict(packages = [],
                    excludes = ["encoding.cp1006", "encoding.cp037"],
                    includes = [], path=[], include_files=[])

【问题讨论】:

它们中的大多数可能可以安全地排除在外,但它们不仅仅用于您的源文件 - 如果任何代码(包括您正在导入的模块)执行类似 s.decode('punycode') 的操作,则需要对应的编解码器。您至少应该将 ascii、utf_8、latin_1、cp1252 和 mbcs 留在那里。 好的,谢谢 Thomas,我包括了 wx,它可能正在执行 s.decode。 没问题。我开始评论并最终写了一个小答案,所以我将其作为答案重新发布。 【参考方案1】:

在大多数情况下,可能可以安全地排除大多数编解码器,但很难确定需要哪些编解码器。它们不仅用于您的源文件 - 如果任何代码(包括您要导入的模块)执行 b.decode('punycode') 或 `u.encode('cp860') 之类的操作,则需要相应的编解码器。

您至少应该将 ascii、utf_8、latin_1、cp1252 和 mbcs 留在那里,这些都是常用的。哦,charmap 可能是一个基类,所以把它留在里面可能是最安全的。

其他注意事项:

cp 开头的编解码器是 Windows/DOS 代码页,可能会在不同区域设置的 Windows 上运行。 iso8859 系列在旧 Unix 系统上很相似(现代 Linux 和 Mac 系统倾向于使用 UTF-8)。 mac 系列与旧 Mac 相似(OS X 之前?我不确定) UTF-16 可能在 Windows 上用于处理 unicode。 操作 Python 源代码的代码可能会使用 string_escaperaw_unicode_escape。 base64、hex 和 uu 是将二进制数据转换为文本的不同方式(以显示它,或将其放入 JSON 等纯文本格式) bz2 和 zlib 是压缩算法。 idna 和 punycode 用于处理国际化域名 UTF-32 和 UTF-7 是存储 unicode 的替代方法,不经常显式使用(Python 实际上可以将字符串作为 UTF-32 存储在内存中,但我认为它不使用 codecs.utf_32)。 其他大多数是远东(中文、日文、韩文)文本的编码。现在应该可以使用 Unicode 来处理这个问题,但据我所知,其中一些编码仍然常用。

这应该让您大致了解您的应用程序可能需要什么,但不要忘记您正在使用的某些库可能会以意想不到的方式使用编解码器。代码处理缺少的一些标准编解码器是不正常的。

【讨论】:

以上是关于Python 2.7 cx_freeze:删除我不需要的编码有啥风险?的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7 Cx_Freeze: ImportError: No module named __startup__

matplotlib 数据的 cx_freeze 错误

Python cx_freeze 错误

如何减少 cx_Freeze 编译的 Python 可执行文件大小?

GAE 标准 python 2.7 运行时何时消失?

cx_freeze 帮助 AssertionError