如何使用package.json调用设置环境变量并使这些变量可被其他脚本和命令访问的脚本

问题描述 投票:0回答:1

我有一个cookiecutter Flask应用。我正在尝试修改package.json,以便命令npm start使用Python脚本设置一些环境变量。

现在我的Python脚本似乎运行正常,但是当package.json执行启动Flask的脚本时,未设置环境变量。

我可以开始阐明可能引起问题的原因。我的Python脚本可能在与Flask不同的进程中运行,并且正在自己的进程中设置环境变量,但是Flask无法访问它们。我需要做某种类似的方式来采购.bashrc。但是我不知道那是什么。也许问题是完全不同的!

这是我的package.json的一大块:

"scripts": {
"build": "NODE_ENV=production webpack --progress --colors -p",
"start": "npm run set-trusted-vars-no-force && npm run start-servers",
"start-local": "npm run set-local-vars && npm start",
"start-servers": "concurrently -n \"WEBPACK,FLASK\" -c \"bgBlue.bold,bgMagenta.bold\" \"npm run webpack-dev-server\" \"npm run flask-server\"",
"webpack-dev-server": "NODE_ENV=debug webpack-dev-server --port 8081 --hot --inline $PUBLIC",
"flask-server": "flask run",
"lint": "eslint \"assets/js/*.js\"",
"set-trusted-vars": "python ../config/set_env_vars.py --reset T --env trusted --credentials ../config/credentials/secrets.yml --config ../config/config.yml",
"set-trusted-vars-no-force": "python ../config/set_dev_env_vars.py --env trusted --credentials ../config/credentials/secrets.yml --config ../config/config.yml",
"set-local-vars": "python ../config/set_dev_env_vars.py --reset T'",
"set-local-vars-no-force": "python ../config/set_dev_env_vars.py"

}

这里是set_dev_env_vars.py的一小部分相关部分:

def set_config(config_path, config_name):
    with open(config_path) as file:
        configs = yaml.safe_load(file)
        config = configs[config_name]
        for var in config:
            os.environ[var] = str(config[var])
            print(var, os.environ[var])

这里是打印内容:

ENV local
FLASK_APP autoapp.py
FLASK_ENV development
SECRET_KEY not-so-secret
FLASK_RUN_PORT 8000
FLASK_RUN_HOST 0.0.0.0

烧瓶最终抱怨:

[FLASK] Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
[FLASK] npm ERR! code ELIFECYCLE
[FLASK] npm ERR! errno 2
[FLASK] npm ERR! [email protected] flask-server: `flask run`
[FLASK] npm ERR! Exit status 2

设置环境变量以便Flask可以找到它们的正确方法是什么?

ps.s。我知道在没有其他上下文的情况下,这似乎是设置环境变量的过度设计的解决方案,但是我还要处理在这里不可见的更复杂的情况。

python flask environment-variables package.json npm-scripts
1个回答
0
投票

我的Python脚本可能与Flask在不同的进程中运行,并且正在自己的进程中设置环境变量,但Flask无法访问它们。

os.environ['FOO']='bar'设置环境变量将在过程或其子进程(see this answer)的持续时间内设置它们。Otherthreads不鼓励尝试让Python在全球范围内将它们设置为一些骇人听闻的解决方案。

不仅如此,而且如果set_dev_env_vars.py确实全局设置了环境变量,则这会将前端与Flask服务器绑定到同一台计算机上。分离这两个是标准程序。我很好奇您是否有理由从前端启动后端服务器?这是flask-cookiecutter的行为还是您自己实施(或坚持使用)的行为?]

大概config.yml也包含前端配置。也许您应该从那里分离出烧瓶相关的配置值,并将它们写入.env文件,然后使用python-dotenv将它们加载到Flask应用程序中。您甚至可以使用python-dotenv使前端加载其配置。

通过进行这种分离,您只需简单地确保所需的dot-env (javascript)文件可用于相应的服务器,即可将前端与后端分开部署。

© www.soinside.com 2019 - 2024. All rights reserved.