uwsgi虚拟环境与项目根目录路径不同时出现No module named 'encodings'错误
问题根因分析
- 首先错误日志里的
!!! Python Home is not a directory: /home/venvs/py39 !!!才是核心报错,不是项目路径未添加到PythonPath导致的问题:encodings是Python标准库自带模块,只要虚拟环境能被正常读取就必然存在,报错的本质是uWSGI运行身份www-data没有虚拟环境目录的访问权限,导致Python初始化阶段连标准库都无法加载。 - 项目放在虚拟环境目录内可正常运行的原因:你大概率在部署项目时给虚拟环境下的项目子目录开放了
www-data的访问权限,连带让uWSGI可以正常读取虚拟环境的标准库文件。
修复步骤
步骤1:修复虚拟环境目录权限
Debian默认/home下的用户目录权限为700或750,非目录所属用户/用户组的www-data默认无进入权限,可通过以下命令验证:
sudo -u www-data ls /home/venvs/py39
如果提示无权限,执行以下命令开放访问:
# 给虚拟环境上级目录开放进入权限 chmod 755 /home/venvs # 给整个虚拟环境目录开放读和执行权限 chmod -R 755 /home/venvs/py39
也可以选择将虚拟环境移动到/opt这类公共系统目录下,避免/home目录的权限限制。
步骤2:验证Python可正常加载
切换到www-data身份验证标准库可正常导入:
sudo -u www-data /home/venvs/py39/bin/python -c "import encodings; print('权限验证通过')"
输出权限验证通过则表示权限问题已解决。
步骤3:优化uWSGI配置
你的配置中同时存在pythonpath和python-path两个冗余配置,可删除其中一个,另外可显式指定home参数避免虚拟环境识别异常,最终参考配置如下:
[uwsgi] project-home = /opt/local/apps/MyProject plugins-dir = /usr/lib/uwsgi/plugins plugin = python39 # 虚拟环境显式声明 virtualenv = /home/venvs/py39 home = /home/venvs/py39 # 仅保留一个pythonpath配置 pythonpath = %(project-home) master = 1 chdir = %(project-home) socket = /var/run/uwsgi/%n.sock chmod-socket = 666 manage-script-name = True module = wsgi callable = app uid = www-data gid = www-data processes = 8 log-date = true
内容的提问来源于stack exchange,提问作者wax
相关产品推荐
相关产品推荐

