如何让uWSGI Emperor使用虚拟环境内的Python3运行Django应用
解决uWSGI Emperor使用虚拟环境Python3的问题
你遇到的ImportError: No module named site错误,本质是因为全局安装的uWSGI是基于Python2.7编译的,它会强制用Python2来加载你的Python3虚拟环境,自然找不到对应版本的site模块。下面是具体的解决方法:
1. 修改init.d脚本中的DAEMON路径
这是最直接的办法,让uWSGI Emperor直接调用虚拟环境里基于Python3编译的uWSGI:
- 先找到虚拟环境内的uWSGI路径,一般是
/root/Env/firstsite/bin/uwsgi(虚拟环境的bin目录下会包含适配该环境Python版本的uWSGI) - 打开你的uWSGI init.d配置文件(通常路径是
/etc/init.d/uwsgi),找到DAEMON=/usr/local/bin/uwsgi这一行,把它替换成虚拟环境的uWSGI路径:DAEMON=/root/Env/firstsite/bin/uwsgi - 保存文件后,重启uWSGI服务生效:
sudo service uwsgi restart
2. 在项目的uWSGI配置文件中明确指定虚拟环境(双重保险)
为了避免后续出现环境混淆,建议在每个Django项目的uWSGI配置文件(比如firstsite_uwsgi.ini)里添加虚拟环境的配置:
[uwsgi] # 你的其他配置(比如socket、processes等) home = /root/Env/firstsite # 指定虚拟环境路径 pythonpath = /path/to/your/django/project # Django项目根目录 module = firstsite.wsgi:application # WSGI入口模块
这里的home参数会让uWSGI自动切换到指定的虚拟环境,使用其中的Python3解释器。
关于upstart配置中的PATH
你提到的PATH=/sbin:/bin:/usr/sbin:/usr/bin并不会直接导致使用Python2运行。PATH只是系统查找可执行文件的顺序,只要你已经在init.d脚本里指定了虚拟环境的uWSGI路径,或者在项目配置里明确了Python环境,这个PATH配置就不会影响。但如果upstart脚本里是直接调用uwsgi命令而不是绝对路径,那系统会从PATH里找第一个匹配的(也就是全局的Python2版本uWSGI),所以关键还是要指定正确的uWSGI绝对路径。
内容的提问来源于stack exchange,提问作者gseiten
相关产品推荐
相关产品推荐

