ModuleNotFoundError:没有名为 'encodings' 的模块 - 当 virtualenv 路径与项目主页不同时出现 uwsgi 错误



我得到一个ModuleNotFoundError:没有模块名为'encodings'错误从uwsgi当虚拟环境路径不同于项目的家。

环境:

OS: debian bullseye
uwsgi version: 2.0.19.1-debian
python version: 3.9

错误场景:

virtualenv:/home/venvs/py39项目主页:/opt/local/apps/myproject

但是,当项目home在虚拟环境中时,该错误不会出现。virtualenv:/home/venvs/py39项目主页:/home/venvs/py39/apps/myproject

失败的配置:

[uwsgi]
project-home = /opt/local/apps/MyProject
plugins-dir = /usr/lib/uwsgi/plugins
plugin = python39
pythonpath = %(project-home)
virtualenv = /home/venvs/py39 
master = 1 
chdir = %(project-home)
socket = /var/run/uwsgi/%n.sock
chmod-socket = 666
manage-script-name = True
python-path = %(project-home) 
module = wsgi
callable = app
uid = www-data
gid = www-data
processes = 8
log-date = true

错误信息:

Python version: 3.9.2 (default, Feb 28 2021, 17:03:44)  [GCC 10.2.1 20210110]
!!! Python Home is not a directory: /home/venvs/py39 !!!
Set PythonHome to /home/venvs/py39
Python path configuration:
PYTHONHOME = '/home/venvs/py39'
PYTHONPATH = (not set)
program name = '/home/venvs/py39/bin/python'
isolated = 0
environment = 1
user site = 1
import site = 1
sys._base_executable = '/home/venvs/py39/bin/python'
sys.base_prefix = '/home/venvs/py39'
sys.base_exec_prefix = '/home/venvs/py39'
sys.platlibdir = 'lib'
sys.executable = '/home/venvs/py39/bin/python'
sys.prefix = '/home/venvs/py39'
sys.exec_prefix = '/home/venvs/py39'
sys.path = [
'/home/venvs/py39/lib/python39.zip',
'/home/venvs/py39/lib/python3.9',
'/home/venvs/py39/lib/python3.9/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'

注意PYTHONHOME(和PYTHONPATH)是由uswgi使用conf

中的信息设置的。工作配置当项目home是venv

中的目录时
[uwsgi]
project-home = /home/venvs/py39/apps/MyProject
plugins-dir = /usr/lib/uwsgi/plugins
plugin = python39
pythonpath = %(project-home)
virtualenv = /home/venvs/py39 
master = 1 
chdir = %(project-home)
socket = /var/run/uwsgi/%n.sock
chmod-socket = 666
manage-script-name = True
python-path = %(project-home) 
module = wsgi
callable = app
uid = www-data
gid = www-data
processes = 8
log-date = true

上面的conf是成功的,日志中有这个消息:

** Operational MODE: preforking ***
added /home/venvs/py39/apps/MyProject to pythonpath.
*** uWSGI is running in multiple interpreter mode ***

就好像在第一个场景中项目路径没有添加到python路径(由uwsgi完成),但在第二个场景中工作。

还有人见过这个吗?

我从Debian 10升级到11,virtualenv仍然是python 3.7,所以我只是删除了virtualenv并用python 3.9重新创建它,它又可以工作了。

最新更新