如何在Supervisor中激活Python虚拟环境并运行wsgi.py?
解决Supervisord无法加载虚拟环境模块的问题
我遇到过好几个类似的情况,核心原因其实是supervisord默认不会加载你的虚拟环境上下文——你手动在终端里source activate时,会把虚拟环境的路径自动加到PATH和PYTHONPATH里,但supervisord启动进程时用的是系统默认环境,根本找不到虚拟环境里安装的tensorflow、flask等模块。下面给你几个靠谱的解决方案:
方案1:直接调用虚拟环境内的Python解释器(最推荐)
这是最直接有效的方法,跳过"激活环境"的步骤,直接让supervisord调用虚拟环境里的Python。
首先找到你的tensorflow_p36虚拟环境的Python路径:
- 如果是Anaconda安装的:
/home/你的用户名/anaconda3/envs/tensorflow_p36/bin/python - 如果是virtualenv安装的:
/home/你的用户名/.virtualenvs/tensorflow_p36/bin/python
然后修改/etc/supervisord.conf里的进程配置段,把command改成直接用这个Python路径运行wsgi.py:
[program:your_app_name] # 替换成你自己的虚拟环境Python路径和wsgi.py路径 command=/home/你的用户名/anaconda3/envs/tensorflow_p36/bin/python /path/to/your/wsgi.py directory=/path/to/your/app/directory # 你的项目根目录 autostart=true autorestart=true stdout_logfile=/var/log/your_app_stdout.log stderr_logfile=/var/log/your_app_stderr.log
这样supervisord直接调用虚拟环境里的Python,自然能找到里面的所有模块。
方案2:用启动脚本封装激活命令
如果觉得直接写长路径麻烦,可以写一个shell脚本封装激活+启动的流程:
- 创建
start_app.sh脚本,内容如下(注意所有路径用绝对路径):
#!/bin/bash # 激活虚拟环境(替换成你自己的anaconda或virtualenv的activate路径) source /home/你的用户名/anaconda3/bin/activate tensorflow_p36 # 运行应用 python /path/to/your/wsgi.py
- 给脚本加执行权限:
chmod +x /path/to/start_app.sh
- 修改supervisord.conf里的
command指向这个脚本:
[program:your_app_name] command=/path/to/start_app.sh directory=/path/to/your/app/directory autostart=true autorestart=true stdout_logfile=/var/log/your_app_stdout.log stderr_logfile=/var/log/your_app_stderr.log
方案3:手动在supervisord配置里设置环境变量
如果上面两种方法都不行,还可以手动模拟source activate的效果,在配置里指定环境变量:
[program:your_app_name] command=python /path/to/your/wsgi.py directory=/path/to/your/app/directory # 把虚拟环境的路径加到PATH和PYTHONPATH最前面 environment=PATH="/home/你的用户名/anaconda3/envs/tensorflow_p36/bin:%(ENV_PATH)s", PYTHONPATH="/home/你的用户名/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages:%(ENV_PYTHONPATH)s" autostart=true autorestart=true stdout_logfile=/var/log/your_app_stdout.log stderr_logfile=/var/log/your_app_stderr.log
最后一步:重启Supervisord生效
修改完配置后,记得重启supervisord让配置生效:
sudo systemctl restart supervisord
或者用supervisorctl热更新:
sudo supervisorctl reread sudo supervisorctl update
内容的提问来源于stack exchange,提问作者Grimlock
相关产品推荐
相关产品推荐

