You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:06:02