【问题标题】:set virtual environment variable while script runs?在脚本运行时设置虚拟环境变量?
【发布时间】:2017-05-18 20:45:44
【问题描述】:

我想将我的凭据保存在 gitignored 文件 (config_vars.env) 中。 然后我想开始我的项目并将这些凭据设置为环境变量,因为我的程序使用os.environ.get('DB_NAME') 等。

所以我希望在我的脚本运行时设置这些环境变量,然后在我的程序停止运行时删除。

我可以直接使用 python 或 bash 设置它们,然后在退出时取消设置它们。但这并不理想,因为如果我的程序崩溃,环境变量就会保留在那里。

理想情况下,我可以在虚拟环境中自动设置它们,仅对我的进程可用,并且当进程停止运行时,环境变量就消失了。

有没有办法在原生 python 中做到这一点?我已经研究过诸如 python 的 click 或 dotenv 之类的东西,但没有其他方法吗?

这是我目前所得到的:

import os
import subprocess

def bash_command():

    #not good
    #subprocess.Popen(cmd, shell=False, executable=".\git-bash.exe")
    #os.popen('setenv a b')

    subprocess.call("config_vars.sh", shell=False)
    print(os.environ.get('DB_NAME')) # prints None because the env var dies with bash
    import time
    time.sleep(5) # delays for 5 seconds

bash_command()

而 config_vars.sh 是:

export ENV_FILE=env/config_vars.env
echo $DB_NAME

那个 echo 命令显示它有效,但是 bash 进程结束,删除了那个环境变量(或整个虚拟环境),python 进程继续,但无法访问它。

所以问题是:如何设置在我的 python 进程终止时终止的环境变量?

【问题讨论】:

  • DB_NAME 设置在哪里?
  • 在文件 env/config_vars.env 中我认为是“export DB_NAME...”
  • DB_NAME 根本没有被脚本设置,除非你这样做source env/config_vars.env

标签: python bash environment-variables


【解决方案1】:

您必须捕获脚本的输出;孩子不能影响父母的环境,所以你需要某种形式的进程间通信。

value = subprocess.check_output("config_vars.sh", shell=False).lstrip('\n')

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2019-07-28
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多