致命的 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 一起正确安装
你能从你的系统变量中粘贴你的PYTHONHOME
和PYTHONPATH
吗?
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 使用提供的规范文件,而不是从头开始制作一个,并且您必须将丢失模块的路径放在 datas
的 Analysis
列表中。见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:无法加载文件系统编解码器的主要内容,如果未能解决你的问题,请参考以下文章
为啥在使用 pytest-qt 进行测试时出现致命的 Python 错误?
致命的 Python 错误:无法获取随机数来初始化 Python