致命的Python错误:init_fs_encoding:在尝试启动uwsgi时未能获取文件系统编码的Python编解码器。

39

我正试图在我的虚拟环境中启动uwsgi服务器,但在添加了plugin python3选项后,每次都会出现以下错误:

!!! Python Home is not a directory: /home/env3/educ !!!
Set PythonHome to /home/env3/educ
Python path configuration:
  PYTHONHOME = '/home/env3/educ'
  PYTHONPATH = (not set)
  program name = '/home/env3/educ/bin/python'
  isolated = 0
  environment = 1
  user site = 1
  import site = 1
  sys._base_executable = '/home/env3/educ/bin/python'
  sys.base_prefix = '/home/env3/educ'
  sys.base_exec_prefix = '/home/env3/educ'
  sys.executable = '/home/env3/educ/bin/python'
  sys.prefix = '/home/env3/educ'
  sys.exec_prefix = '/home/env3/educ'
  sys.path = [
    '/home/env3/educ/lib/python38.zip',
    '/home/env3/educ/lib/python3.8',
    '/home/env3/educ/lib/python3.8/lib-dynload',
  ]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007efe89db8780 (most recent call first):
<no Python frame>

我尝试使用python3 -m venv env创建了新的虚拟环境,并将项目文件移动到其中,但仍然出现相同的错误。 这是我的uwsgi.ini文件:

[uwsgi]

base = /home/env3/educ
projectname = educ

plugins = python3
master = true
virtualenv = /home/env3/%(projectname)
pythonpath = %(base)
env = DJANGO_SETTINGS_MODULE=%(projectname).settings.pro
module = %(projectname).wsgi:application
socket = /tmp/%(projectname).sock
chmod-socket = 666

我使用Python 3.8.5

我正在尝试使用Django + uWSGI + nginx + Postgresql。


我在启动Python时也遇到了随机错误。不知道为什么会出现这种情况。 - Christopher J.
1
在WSL2上遇到了同样的问题,这是特别致命的,因为我甚至不能使用apt命令而出现以下错误:Reading package lists... Done E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db > /dev/null; fi' E: Sub-process returned an error code。异常令人沮丧,不幸的是,在我的情况下,unset也没有起作用。 - killshot13
请参见 https://github.com/BusKill/buskill-app/issues/64#issuecomment-1537221491 - Michael Altfield
8个回答

36

我看到你的PYTHONHOME设置为PYTHONHOME = '/home/env3/educ'。请检查它是否真的存在。

对我来说,解决方案删除PYTHONHOME环境变量。对于你来说,可以只是这样,或者将该变量设置为另一个值。这在Windows上有效,并且在Linux上肯定也有效。如果有人在Linux上尝试了这个方法,请在此处发表评论!

CPython开发人员在这里确认了解决方案:

这不是Python的错误,而是在不需要设置PYTHONHOME和/或PYTHONPATH时设置它们的症状。 在几乎所有情况下,您都不需要设置它们

在PYTHONHOME的情况下,几乎总是设置错误


3
我遇到了同样的问题,但是对于我来说,主目录和路径已经没有设置。有什么想法吗? - James.L
1
好的,我从电脑中删除了Python,然后重新安装它,现在它又可以工作了,尽管我现在必须重新安装所有的pip库。 - James.L

13
我通过取消PYTHONHOME或PYTHONPATH来解决这个问题,因为它们会覆盖虚拟环境变量。
在我的情况下,这是由于我的管理员设置的基本环境引起的。我会尝试通过以下方式删除PYTHONHOME和PYTHONPATH变量:
unset PYTHONPATH
unset PYTHONHOME

1
你把这个放在哪里?是放在终端里还是放在你要运行的文件里? - Shep Bryan
1
在终端中,它会取消设置PYTHONPATH和PYTHONHOME,“unset”是一个终端命令。 - CrmXao
在Windows中使用哪些命令 - Jason Huang
对于Windows系统,你可以使用以下命令将PYTHONPATH和PYTHONHOME设置为空字符串:"set PYTHONPATH= set PYTHONHOME=" - CrmXao
这对我有用,所以如果其他人在Linux上遇到这个问题,请在寻找其他方法之前尝试这个。 - JamesT

7
这则消息是为那些将来会遇到同样问题的人而写的。我无法使用我的配置启动uWSGI,并且在日志文件中也看到了相同的错误信息。

init_fs_encoding: failed to get the Python codec of the filesystem encoding Python runtime state: core initialized ModuleNotFoundError: No module named 'encodings'

问题是uWSGI没有足够的权限访问虚拟环境。当我修复了权限后,uWSGI就能启动我的配置文件了。
Denys 在他的消息中发布了uwsgi.ini配置文件。我猜想虚拟环境的路径是不正确的。
base = /home/env3/educ
projectname = educ
virtualenv = /home/env3/%(projectname)

如果虚拟环境是在项目目录中创建的,则路径应该如下所示:
virtualenv = /home/env3/%(projectname)/env

在我的情况下,我在virtualenv路径的结尾添加了“/bin”,这就是导致错误的原因。 - vvvvv

1
在我的情况下,问题的原因在于virtualenv的设置。在Linux系统中,virtualenv的路径很可能以/home/(你的登录用户名)/env3/开头,而不是/home/env3/。因此,在尝试其他解决方案之前,最好确保您的virtualenv路径是正确的。

0
在我的情况下,我不得不删除home=变量,这样问题就解决了。

0

尝试在uwsgi.ini文件中使用http=127.0.0.1:8000。 这解决了我的问题。


0
在我的情况下,我没有取消设置pythonhome、pythonpath。只需在cygwin终端中键入以下内容即可:

python.exe setup.py install (注意“.exe”)


0

您需要清除环境变量 PYTHONHOME

解决方案

在出现此错误的行之前,添加以下内容

import os
if 'PYTHONHOME' in os.environ:
   del os.environ['PYTHONHOME']

解释

在一个作为 AppImage 运行的 Python 应用程序中(该应用程序会提取并在临时 squashfs 文件系统中执行自己),当尝试使用 subprocess 模块执行 cinnamon-screensaver-command --lock 命令时,我遇到了这个问题。

attempting to execute 表示尝试执行。在 Python 中使用 subprocess 模块调用命令可以让我们在 Python 代码中运行外部命令。如果你使用的是 Linux 系统,那么 cinnamon-screensaver-command --lock 命令会锁定屏幕。

Python path configuration:
  PYTHONHOME = '/tmp/.mount_buskilParXTg/opt/python3.7'
  PYTHONPATH = (not set)
  program name = '/usr/bin/python3'
  isolated = 0
  environment = 1
  user site = 1
  import site = 1
  sys._base_executable = '/usr/bin/python3'
  sys.base_prefix = '/tmp/.mount_buskilParXTg/opt/python3.7'
  sys.base_exec_prefix = '/tmp/.mount_buskilParXTg/opt/python3.7'
  sys.executable = '/usr/bin/python3'
  sys.prefix = '/tmp/.mount_buskilParXTg/opt/python3.7'
  sys.exec_prefix = '/tmp/.mount_buskilParXTg/opt/python3.7'
  sys.path = [
    '/tmp/.mount_buskilParXTg/opt/python3.7/lib/python38.zip',
    '/tmp/.mount_buskilParXTg/opt/python3.7/lib/python3.8',
    '/tmp/.mount_buskilParXTg/opt/python3.7/lib/python3.8/lib-dynload',
  ]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized

ModuleNotFoundError: No module named 'encodings'

如果您使用del os.environ['PYTHONHOME']取消设置环境变量,那么问题就会消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接