启动uWSGI时遭遇No module named 'encodings'错误求助
我之前也碰到过一模一样的坑!这个"No module named 'encodings'"错误本质是uWSGI通过systemd启动时,要么路径拼写错误导致没加载到虚拟环境,要么虚拟环境的Python路径识别混乱,咱们一步步解决:
首先揪出最明显的错误:systemd服务里的路径拼写问题
看你的uWSGI服务配置里的ExecStart命令:
cd /home/testuser1/myprojcettss; source /home/testuser1/myproject/bin/activate; uwsgi --ini /etc/uwsgi/sites/myprojecttss.ini
这里的项目目录写成了myprojcettss(少了个字母e),实际你的项目是myprojecttss!这个拼写错误会导致cd命令失败,后续的source激活虚拟环境也不会执行,uWSGI只能调用系统Python,但你的配置里又指定了PythonHome到虚拟环境,直接触发了Python初始化冲突,就报了encodings模块找不到的错误。
修复方案一:修正systemd服务配置,简化启动逻辑
没必要在systemd里手动source激活虚拟环境,uWSGI本身可以通过配置直接识别虚拟环境。修改后的/etc/systemd/system/uwsgi.service:
[Unit] Description=uWSGI Emperor service [Service] ExecStartPre=-/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown testuser1:nginx /run/uwsgi' # 去掉多余的cd和source,直接用emperor模式启动,并且指定运行用户 ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites Restart=always KillSignal=SIGQUIT Type=notify NotifyAccess=all User=testuser1 Group=nginx
修复方案二:调整uWSGI配置文件,明确虚拟环境路径
修改/etc/uwsgi/sites/myprojecttss.ini,把模糊的home换成更明确的virtualenv,同时指定虚拟环境里的Python解释器路径,避免路径混淆:
[uwsgi] project = myprojecttss username = testuser1 base = /home/%(username) env = myproject chdir = %(base)/%(project) module = %(project).wsgi # 用virtualenv明确指定虚拟环境目录,比home更清晰 virtualenv = %(base)/%(env) # 强制指定虚拟环境内的Python路径,彻底避免系统Python干扰 python = %(base)/%(env)/bin/python3.6 master = true processes = 5 # 确保binary-path指向虚拟环境里的uwsgi binary-path = %(base)/%(env)/bin/uwsgi uid = %(username) gid = nginx socket = /run/uwsgi/%(project).sock chown-socket = %(username):nginx chmod-socket = 775 vacuum = true die-on-term = true
最后执行这些步骤生效
- 停止当前uWSGI服务:
sudo systemctl stop uwsgi - 重新加载systemd配置:
sudo systemctl daemon-reload - 启动uWSGI服务:
sudo systemctl start uwsgi - 查看状态确认正常:
sudo systemctl status uwsgi -l
这样修改后,uWSGI会直接用虚拟环境里的Python运行,不会再出现encodings模块找不到的问题了。
内容的提问来源于stack exchange,提问作者connie
相关产品推荐
相关产品推荐

