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

Python 2.7 cx_freeze: What are the risks of removing the encodings that I dont need?

当我在我的应用程序上执行 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=[])

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

至少你应该留下ascii,utf_8,latin_1,cp1252和mbcs,这些是常用的。哦,charmap 可能是基数 class,所以把它留在里面可能是最安全的。

其他注意事项:

  • 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 来处理这个问题,但据我所知,其中一些编码仍在常用。

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