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
KillsupervisorORD
。因为它位于前台,所以只需按住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解释器。