【问题标题】:How to activate python virtual environment in supervisor?如何在主管中激活 python 虚拟环境?
【发布时间】:2018-08-14 13:07:36
【问题描述】:

我想做什么?

激活 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 时,我收到以下消息:

停止supervisord:[确定]

启动 supervisord:/usr/local/lib/python2.7/site-packages/supervisor-3.3.4-py2.7.egg/supervisor/options.py:461:UserWarning:Supervisord 以 root 身份运行并且它正在默认位置(包括其当前工作目录)中搜索其配置文件;您可能想要指定一个“-c”参数来指定配置文件的绝对路径以提高安全性。 'Supervisord 以 root 身份运行并且正在搜索' [好的]

【问题讨论】:

    标签: python virtualenv supervisord


    【解决方案1】:

    您的命令不会激活环境 - 它只是调用该文件夹中的 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
    

    【讨论】:

    • 是的,我明白其中的区别,我试过这个命令:source activate tensorflow_p36 && python /home/ec2-user/abc/wsgi.py,但它似乎不起作用。我尝试使用组(如问题所述),但它也不起作用。你能分享你所建议的代码吗?
    • 又试了一次,还是不行。你能用一个非常简单的python文件自己试试吗?似乎第二个操作(在 && 之后)永远不会被执行。
    • 调用该 python 文件将使用该 python 运行脚本 - 但在正常环境下 不,这不是真的。从虚拟环境调用 python 会自动激活该环境。此功能内置于 Python 中——当python 二进制文件检测到它不是系统或独立二进制文件而是虚拟环境二进制文件时,它会激活该虚拟环境。
    • @phd 我只是做了一些测试来看看,我错了,但是在那个环境中运行 python 确实修改了 PATH 它不会做与激活环境相同的事情。我通过在任何环境之外检查 PATH 变量,然后在虚拟环境中然后从 python(使用 os.environ['PATH'])来测试这一点。每一项的结果都不同。我知道激活 env 而不是仅仅调用 python 解决了我们公司中的一些模块导入问题。
    • 虚拟环境不是要改变$PATH——它是关于拥有一组单独的python库,即它是关于改变sys.path。
    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多