Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 虚拟环境和环境变量_Python_Flask_Gunicorn_Supervisord_Python Venv - Fatal编程技术网

Python 虚拟环境和环境变量

Python 虚拟环境和环境变量,python,flask,gunicorn,supervisord,python-venv,Python,Flask,Gunicorn,Supervisord,Python Venv,要在supervisord下获得gunicorn以使用虚拟环境/home/ubuntu/venv/bin无需寻找放置源代码/home/ubuntu/venv/bin/activate的明智位置。写下以下内容就足够了: [program:hello] command=/home/ubuntu/venv/bin/gunicorn -b localhost:8000 hello:app directory=/home/ubuntu/hello/ environment=PATH="/home/ubun

要在
supervisord
下获得
gunicorn
以使用虚拟环境
/home/ubuntu/venv/bin
无需寻找放置
源代码/home/ubuntu/venv/bin/activate
的明智位置。写下以下内容就足够了:

[program:hello]
command=/home/ubuntu/venv/bin/gunicorn -b localhost:8000 hello:app
directory=/home/ubuntu/hello/
environment=PATH="/home/ubuntu/venv/bin:%(ENV_PATH)"
/usr/supervisor/hello.conf

[program:hello]
command=/home/ubuntu/venv/bin/gunicorn -b localhost:8000 hello:app
directory=/home/ubuntu/prog
stdout_logfile=/home/ubuntu/prog/hello_out.log
stderr_logfile=/home/ubuntu/prog/hello_err.log
user=ubuntu
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

[supervisord]
logfile=/home/ubuntu/prog/hello_supervisord.log
pidfile=/tmp/supervisord.pid
下一个任务是引入大量的环境变量。一种方法是费力地扩充
supervisord
config文件,如下所示

[program:hello]
...
environment=PATH="/home/ubuntu/venv/bin:%(ENV_PATH)",SECRET_KEY="%(ENV_SECRET_KEY)",DATABASE_URI="%(ENV_DATABASE_URI)",etc1,etc2,etc3
有没有一种方法可以一次性引入环境变量(比如说,在初始化环境变量之后,
~/.profile

相关的: ,,,

这是一个配方:

将环境变量写入文件
/home/ubuntu/prog/.env

export FLASK_APP=/home/ubuntu/prog/hello.py
export SECRET_KEY=ABCD
export DATABASE_PASSWORD=EFGH
使用
dotenv
load\u dotenv
加载环境变量

from flask import Flask
from os.path import join, dirname
from os import environ
from dotenv import load_dotenv

app = Flask(__name__)
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

@app.route('/')
def hello():
    SECRET_KEY = environ.get("SECRET_KEY")
    DATABASE_PASSWORD = environ.get("DATABASE_PASSWORD")
    return SECRET_KEY + DATABASE_PASSWORD
编写一个文件
/etc/supervisor/hello.conf

[program:hello]
command=/home/ubuntu/venv/bin/gunicorn -b localhost:8000 hello:app
directory=/home/ubuntu/prog
stdout_logfile=/home/ubuntu/prog/hello_out.log
stderr_logfile=/home/ubuntu/prog/hello_err.log
user=ubuntu
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

[supervisord]
logfile=/home/ubuntu/prog/hello_supervisord.log
pidfile=/tmp/supervisord.pid
加载环境并指向应用程序中的

source /home/ubuntu/prog/.env
环境变量现在已加载

$ export | grep SECRET
declare -x SECRET_KEY="ABCD"
它们将被传递到子流程,而不会影响
supervisord
environment=

在前台启动
supervisord
,确认一切正常

/usr/bin/supervisord -n -edebug -c /etc/supervisor/hello.conf
$ curl localhost:8000
ABCDEFGH
从另一个外壳确认一切正常

/usr/bin/supervisord -n -edebug -c /etc/supervisor/hello.conf
$ curl localhost:8000
ABCDEFGH
Kill
supervisorORD
。因为它位于前台,所以只需按住CTRL-c键即可

作为守护进程启动
supervisord

/usr/bin/supervisord -c /etc/supervisor/hello.conf
注意三个日志文件
prog/hello\u out.log
prog/hello\u err.log
,以及
prog/hello\u supervisord.log

也许最重要的一点是避免使用
supervisord
environment=
。因此chatter建议它处理逗号、引号、制表符甚至换行符。根据经验,这不成立(至少对于
supervisord
3.3.5),文档也不会以这种或那种方式解决它。这两行
如果有人想调查文档的不足,那么这似乎就是问题所在。

要一次性、永久、安全地引入环境变量,您必须在$HOME目录中的.bashrc中添加以下行。 为此,请使用您喜爱的代码编辑器打开主目录中的.bashrc文件:

nano.bashrc

在.bashrc文件中的某个位置添加以下行:

export SECRET\u KEY=“您的密钥。”

现在要在flask中使用这个密钥,您必须导入os模块并像这样使用它

from flask import Flask
import os

app = Flask(__name__)

@app.route('/')
def hello():
    SECRET_KEY = os.environ.get('SECRET_KEY')
    return SECRET_KEY 

希望这能有所帮助。

如果在命令行启动gunicorn,它能工作吗?
supervisord
启动时是否继承您的环境,还是创建自己的环境?输入venv只会设置一些环境变量,因此您需要确保在
supervisord
的环境中正确设置这些变量。@supershot啊!说得好。不,不是。你能推荐另一条线索来调试这个吗?@chepner你说的“继承环境”是什么意思?不管(bash)shell是否在venv中,它会失败。
supervisord
environment
是IIUC,用于环境变量,而不是Python虚拟环境。进入Python虚拟环境只不过是将适当的目录添加到环境中的
PATH
。如果
supervisord
PATH
如果不包含
/home/ubuntu/venv/bin
,则不会使用正确的Python解释器。