致命的 Python 错误:initfsencoding:无法加载文件系统编解码器

Posted

技术标签:

【中文标题】致命的 Python 错误:initfsencoding:无法加载文件系统编解码器【英文标题】:Fatal Python error: initfsencoding: unable to load the file system codec 【发布时间】:2019-06-02 20:45:58 【问题描述】:

我创建了一个简单脚本的 .exe 文件,目的是在服务器上运行它,但是我似乎无法弄清楚这个错误的含义或在网上找到任何答案。故障代码如下:

Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00003c8c (most recent call first):

为了做到这一点,我使用了 pyinstaller

pyinstaller --onefile MyScript.py

当这不起作用时,我也尝试过

pyinstaller MyScript.py

我在 Windows 10、python 3.7 上运行,在管理员命令提示符下,在 C:\ 文件目录中。

我的 sys.path 是

['', 'C:\Users\user\AppData\Local\Programs\Python\Python37-32\python37.zip', 'C:\Users\user\AppData\Local\Programs\Python\Python37- 32\DLLs', 'C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib', 'C:\Users\user\AppData\Local\Programs\Python\Python37-32', ' C:\Users\user\AppData\Roaming\Python\Python37\site-packages', 'C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages', 'C: \Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\win32', 'C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site- packages\win32\lib', 'C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\Pythonwin']

感谢任何帮助

【问题讨论】:

当你在 cmd 中输入 python 时你的 python 会启动吗? 是的 python 工作,所有的 env 路径都与 python 一起正确安装 你能从你的系统变量中粘贴你的PYTHONHOMEPYTHONPATH吗? pythonhome- C:\Python37 pythonpath- C:\Users\esinclair\AppData\Local\Programs\Python\Python37-32 我已经添加到 sys.path 给我的问题中 【参考方案1】:

看起来这是由于 python 安装中的一些问题而发生的。你确定python配置正确吗?您是否将其添加到ENVIRONMENT VARIABLES

很可能是因为您的 PYTHONPATH ,即定位 site-packages 的那个配置不正确。一旦您将PYTHONPATH 指向正确的python3.x 安装,它应该可以正常工作。

一旦从您的 cmd 启动 python 并检查它正在加载哪些站点包。

import sys
sys.path

然后验证您的 PYTHONHOME 中实际存在的内容

【讨论】:

我已经编辑了这个问题来展示这给了我什么 我看路径不一样。您的 python sys.path - C:\Users\user\AppData 和您的系统路径不匹配。 C:\Users\esinclair\AppData。这里用户不匹配 那是我的错,为此我删除了我的名字并输入了用户,我错过了一个 - 路径在我的终端中都匹配! 我建议你用 python 3.6 加载一个虚拟环境并从那里运行脚本。确保在该 virtualenv 中加载 python 3.6 为什么使用 python 3.6 会有所作为?【参考方案2】:

我收到了与 EcSync 完全相同的错误消息。尽管大多数人都指出 python 设置错误,但这对我来说并非如此——除了当我收到错误时我的系统没有从一天到另一天发生变化,我的环境变量与 python sys.path 匹配

EcSync 通过包含一个缺失的模块解决了这个问题,但他们的答案被否决了。我不得不说这个错误也是由于缺少模块引起的。线索在错误信息中:

Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

我只是修改了我的规范文件以包含编码模块,然后一切正常。为此,您可能需要指定 pyinstaller 使用提供的规范文件,而不是从头开始制作一个,并且您必须将丢失模块的路径放在 datasAnalysis 列表中。见here。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案3】:

此错误意味着 Py_SetPath 强制 python 使用不包含 python38.zip 的路径,将 python38.zip 的完整路径名添加到 Py_SetPath,或者不使用 Py_SetPath 而使用 python38._pth。

#define PY_SSIZE_T_CLEAN
#include <Python.h>


int main(int argc char **argv)

        Py_SetPath(L"C:\\path-to\\python-3.8.5-embed-amd64\\python38.zip;C:\\path-to\\python-3.8.5-embed-amd64");
        Py_Initialize();
        // ...


【讨论】:

【参考方案4】:

使用 --standalone 将在整个 python 环境中构建二进制文件。你不需要在目标机器上安装 python 来运行它。

【讨论】:

【参考方案5】:

我刚刚在系统变量中添加了以下内容:

PYTHONPATH ----------------------------C:\Python37

【讨论】:

【参考方案6】:

所以我设法通过重建 exe 文件并将所有站点包从 python 主页转储到 exe dist 文件夹来解决此问题。将再次检查它们以找出导致问题的原因。

编辑

我缩小了范围,发现具体问题是 plotly 包没有被转储到 dist 文件夹中。我不知道为什么,但这是我使用的唯一一个 pyinstaller 无法获取的软件包

【讨论】:

您好,我也遇到了同样的问题,您能告诉我您是如何重建 exe 文件的吗? @SammyJ 无需重建,只需将丢失的包插入 dist 文件夹即可 是否将其添加为隐藏导入工作?您对规范文件进行了任何更改吗?

以上是关于致命的 Python 错误:initfsencoding:无法加载文件系统编解码器的主要内容,如果未能解决你的问题,请参考以下文章

调试 Python 致命错误:已跟踪 GC 对象

为啥在使用 pytest-qt 进行测试时出现致命的 Python 错误?

致命的 Python 错误:无法获取随机数来初始化 Python

致命错误:Python.h:没有这样的文件或目录

尝试运行可执行 Python 脚本时出现致命的 Python 错误

Ubuntu,致命错误:Python.h:没有这样的文件或目录#include <Python.h>