【问题标题】:Fatal Python error: initfsencoding: unable to load the file system codec致命的 Python 错误:initfsencoding:无法加载文件系统编解码器
【发布时间】: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 给我的问题中

标签: python exe pyinstaller codec


【解决方案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 文件夹即可
        • 是否将其添加为隐藏导入工作?您对规范文件进行了任何更改吗?
        猜你喜欢
        • 2019-11-26
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 2015-08-26
        • 2018-12-26
        • 2020-07-03
        • 2017-10-17
        相关资源
        最近更新 更多