如何在supervisor中激活python虚拟环境?

6

我想做什么?

激活tensorflow_p36环境并运行python wsgi.py

我的supervisord.conf文件是什么样子的?

[program:my_program]
command = /home/ec2-user/anaconda3/envs/tensorflow_p36/bin/python /home/ec2-user/abc/wsgi.py
directory= /home/ec2-user/abc/
environment=PATH= "/home/ec2-user/anaconda3/envs/tensorflow_p36/bin"
user= ec2-user
redirect_stderr = True
stdout_logfile = /home/ec2-user/abc/logs/gunicorn/gunicorn_stdout.log
stderr_logfile = /home/ec2-user/abc/logs/gunicorn/gunicorn_stderr.log

该文件位于默认的/etc/supervisord.conf位置。
我已尝试this question中的所有解决方案,但在虚拟环境中安装的模块未被导入。例如,我在导入tensorflow、flask等时出现错误。然而,在终端中执行相同命令后source activate tensorflow_p36却可以正常工作。
我还尝试了this answer中建议的多个程序分组,其中在第一个程序中激活虚拟环境并在第二个程序中运行python命令,并将它们组合在一起。但没有成功,仍然出现相同的导入错误。
额外信息:
当我运行sudo service supervisord restart时,我会收到以下消息:
Stopping supervisord: [ OK ]

启动supervisord:/usr/local/lib/python2.7/site-packages/supervisor-3.3.4-py2.7.egg/supervisor/options.py:461: 用户警告:Supervisord正在以root身份运行,并在默认位置(包括其当前工作目录)中搜索其配置文件;您可能想指定一个"-c"参数,指定一个绝对路径的配置文件以提高安全性。 'Supervisord is running as root and it is searching' [ OK ]

1个回答

3
您的命令并没有激活环境,它只是在调用该文件夹中的Python。我来解释一下区别:
创建环境时会在其中创建一个python.exe文件。调用该python文件将使用该python运行脚本,但在普通环境下。
另一方面,激活环境会更改PATH系统变量,以指向该环境中的所有软件包。
因此,激活环境而不仅仅是使用该环境中的Python运行脚本应该可以解决您的问题。
编辑: 尝试类似于以下内容:
[program:my_program]
command = source activate tensorflow_p36 && python /home/ec2-user/abc/wsgi.py
directory= /home/ec2-user/abc/
environment=PATH= "/home/ec2-user/anaconda3/envs/tensorflow_p36/bin"
user= ec2-user
redirect_stderr = True
stdout_logfile = /home/ec2-user/abc/logs/gunicorn/gunicorn_stdout.log
stderr_logfile = /home/ec2-user/abc/logs/gunicorn/gunicorn_stderr.log

1
是的,我理解它们之间的区别。我尝试过这个命令:source activate tensorflow_p36 && python /home/ec2-user/abc/wsgi.py,但似乎不起作用。我尝试使用组(如问题中提到的),但也不起作用。您能否分享您建议的代码? - Grimlock
我又试了一遍,但还是不行。你能否用一个非常简单的Python文件自己试一下?似乎第二个操作(&&之后)从未被执行。 - Grimlock
2
调用该Python文件将使用该Python运行脚本-但在正常环境下。不,那不是真的。从虚拟环境中调用python会自动激活该环境。这个功能内置于Python中 - 当python二进制文件检测到它不是系统或独立二进制文件而是虚拟环境二进制文件时,它会激活该虚拟环境。 - phd
@phd 我刚刚进行了一些测试,发现我错了。虽然在该环境中运行Python确实会修改PATH,但它并不像激活环境那样做。我通过检查任何环境之外的PATH变量,然后在虚拟环境中以及从Python中进行测试(使用os.environ['PATH'])来进行测试。每个测试结果都不同。我知道,与仅调用Python相比,激活环境可以解决公司中的某些模块导入问题。 - NotSoShabby
虚拟环境不是关于更改 $PATH 的问题,而是关于拥有一个单独的 Python 库集合,即更改 sys.path 的问题。 - phd
这个命令不知道 source 是什么,因为那是一个shell命令而不是一个程序。尝试这样做:command = bash -c "source activate tensorflow_p36 && python /home/ec2-user/abc/wsgi.py" - VoNWooDSoN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接