如何在Supervisor中使用virtualenvwrapper?

26 投票
3 回答
37835 浏览
提问于 2025-04-17 17:52

在我开发和测试项目的时候,我习惯用virtualenvwrapper来管理环境并运行项目:

workon myproject
python myproject.py

当然,当我进入正确的虚拟环境时,我就能使用正确版本的Python,以及运行项目所需的其他库。

现在,我想用Supervisord来管理这个项目,因为它已经准备好部署了。我的问题是,怎样才能正确地告诉Supervisord在执行脚本之前激活正确的虚拟环境呢?我需要写一个单独的bash脚本来完成这个吗,然后在Supervisord的配置文件中调用这个脚本吗?

3 个回答

5

首先,运行

$ workon myproject
$ dirname `which python`
/home/username/.virtualenvs/myproject/bin

然后,在相关的 supervisord.conf 文件中,找到 [program:blabla] 这一部分,添加以下内容:

environment=PATH="/home/username/.virtualenvs/myproject/bin"
12

把你的虚拟环境的路径添加到 supervisord.conf 文件里的 environment 部分:

[program:myproj-uwsgi]
process_name=myproj-uwsgi
command=/home/myuser/.virtualenvs/myproj/bin/uwsgi
    --chdir /home/myuser/projects/myproj
    -w myproj:app
environment=PATH="/home/myuser/.virtualenvs/myproj/bin:%(ENV_PATH)s"
user=myuser
group=myuser
killasgroup=true
startsecs=5
stopwaitsecs=10
57

从命令行使用你的虚拟环境的一种方法是直接使用虚拟环境里面的python可执行文件。

对我来说,我的虚拟环境都放在.virtualenvs这个文件夹里。例如:

/home/ubuntu/.virtualenvs/yourenv/bin/python

这样就不需要使用workon命令了。

在管理一个tornado应用的supervisor.conf文件中,我会这样做:

command=/home/ubuntu/.virtualenvs/myapp/bin/python /usr/share/nginx/www/myapp/application.py --port=%(process_num)s

撰写回答