cx_Freeze:“没有名为‘编解码器’的模块”Windows 10

Posted

技术标签:

【中文标题】cx_Freeze:“没有名为‘编解码器’的模块”Windows 10【英文标题】:cx_Freeze: “No module named 'codecs'” Windows 10 【发布时间】:2018-04-23 18:02:02 【问题描述】:

我目前正在使用 pygame 模块制作游戏。 我已按照以下链接的指示进行操作。 https://pythonprogramming.net/converting-pygame-executable-cx_freeze/

我已经解决了 KeyError KeyError: 'TCL_Library' when I use cx_Freeze 等一些问题 属性错误 Attribute Error while using cx_Freeze

setup.py 的构建已经完成,但是当我运行游戏的 exe 文件时,它崩溃并出现致命的 Python 错误:Py_Initialize: 无法加载文件系统编解码器

    Fatal Python error: Py_Initialize: unable to load the file system codec
Traceback (most recent call last):
  File "C:\Users\jinju\AppData\Local\Programs\Python\Python35-32\lib\encodings\__init__.py", line 31, in <module>
ImportError: No module named 'codecs'

我已阅读之前在 Linux 内核 (cx_Freeze: "No module named 'codecs'") 中回答的问题,但我想知道我应该如何处理我的 Windows 10 内核。

我使用通过python主页下载的Python 3.5.3,cx_Freeze-5.1-cp35-cp35m-win32.whl通过pip自动下载,pygame 1.9.3通过pip下载whl。

setup.py 文件

import cx_Freeze, os

executables = [cx_Freeze.Executable("quatris.py")]

os.environ['TCL_LIBRARY'] = r'C:\Users\jinju\AppData\Local\Programs\Python\Python35-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\jinju\AppData\Local\Programs\Python\Python35-32\tcl\tk8.6'

cx_Freeze.setup(
    name = "QUATRIS",
    version = '1.0',
    options="build_exe": "packages":["pygame"], "include_files":['ab_main.wav', 'ct_main.wav', 'f3_main.wav',
                                                                    'ff_main.wav', 'gta4_soviet.wav',
                                                                    'h3_neverforget.wav', 'h_onefinaleffort.wav',
                                                                    'm_sweden.wav', 'p1_stillalive.wav',
                                                                    'p2_caramiaaddio.wav', 'smb_1-up.wav',
                                                                    'smb_bump.wav', 'smb_coin.wav', 'smb_gameover.wav',
                                                                    'smb_mariodie.wav', 'smb_overworld.wav',
                                                                    'smb_pause.wav', 'tes4o_main.wav',
                                                                    'tes5s_dragonborn.wav', 'tes5s_farhorizons.wav',
                                                                    'tetris.wav', 'tloz_intro.wav', 'tw3wh_main.wav'],
    executables = executables)

我尝试查看 init.py 文件和 codecs.py 文件。当我尝试导入编解码器时,

module 'codecs' has no attribute 'register'

这东西出来了。

# Register the search_function in the Python codec registry
codecs.register(search_function)

这是init.py文件中出现错误的部分。

【问题讨论】:

你的 quatris.py 运行没有错误不是吗? 即使使用cx_freeze 5.1.1 我仍然收到此错误。我一直跟踪回溯,并意识到它是一个特定的模块,它是错误的根源。就我而言,源代码是 tweepy 模块。我在 exe 中不需要该模块,所以我只是将其注释掉,不再出现该错误。 【参考方案1】:

这是 cx_Freeze 中的一个错误,现已更正:https://github.com/anthony-tuininga/cx_Freeze/commit/9c98492911d4c75587d3687206d11812b48bf144

【讨论】:

我刚刚通过pip install cx_Freeze --upgrade (v5.1) 安装并且遇到了同样的问题。当我尝试运行 .exe 文件时,它会因相同的错误而崩溃,No module named 'codecs'。将import codec 添加到我的python 文件顶部没有任何效果。我在带有 amd64 cpu 的 Windows 上使用 Python 3.6.1。 是的,在我发布 5.1.1 版本之前,您必须从源代码构建! cx_Freeze 5.1.1 刚刚发布,其中包含此修复程序。 我在使用 cx_Freeze 5.1.1 时遇到了同样的问题【参考方案2】:

一个简单但不优雅的方法可以是放置

if not True:
    import codecs

在你的代码中。

【讨论】:

你的意思是在 setup.py 里面? @MinhaArmadaJu 不,在普通 Python 代码中的某个地方。 我将您的代码粘贴到我的 main.py 代码中并重新构建了游戏,但错误仍然存​​在。 对我来说,我直接在我的 main 顶部导入了编解码器,它可以工作。

以上是关于cx_Freeze:“没有名为‘编解码器’的模块”Windows 10的主要内容,如果未能解决你的问题,请参考以下文章

Python cx_Freeze __init__“没有名为编解码器的模块”

cx_Freeze 不工作 - 没有名为 cx_Freeze 的模块

cx_Freeze:主脚本中的 Python 错误。 Python 3.6 + cx_Freeze

Python cx_Freeze 错误“没有名为 'cx_Freeze.util' 的模块”

cx_freeze 错误“cx_Freeze.freezer.ConfigError:没有名为控制台的基础”

cx_freeze 帮助 AssertionError