【问题标题】:os.environ.get() returns None for Heroku environmental variablesos.environ.get() 为 Heroku 环境变量返回 None
【发布时间】:2018-04-17 11:36:14
【问题描述】:

我通过 Heroku 设置了一些环境变量来访问 GrapheneDB 实例。当我使用 Heroku CLI 命令heroku config 时,所有环境变量都按预期返回。

例如,"heroku config" 返回:

GRAPHENEDB_BOLT_PASSWORD: some_password   
GRAPHENEDB_BOLT_URL:      bolt://hobby-someletters.dbs.graphenedb.com:24786
GRAPHENEDB_BOLT_USER:     appnumbers  
GRAPHENEDB_URL:           http://appnumbers:some_password@hobby-someletters.dbs.graphenedb.com:24789  
NEO4J_REST_URL:           GRAPHENEDB_URL

但是,当我尝试使用os.environ.get() 方法访问这些环境变量时,所有三个打印语句都返回None,而不是heroku config 返回的所需输出。这向我表明 Python 环境无权访问 Heroku 环境变量。如何让 python 访问这些?

import os
from py2neo import Graph

graphenedb_url = os.environ.get('GRAPHENEDB_BOLT_URL')
graphenedb_user = os.environ.get("GRAPHENEDB_BOLT_USER")
graphenedb_pass = os.environ.get("GRAPHENEDB_BOLT_PASSWORD")

print(graphenedb_url)
print(graphenedb_user)
print(graphenedb_pass)

我尝试过使用Acess Heroku variables from Flask 的解决方案 但是当我执行命令时: heroku config:pull --overwrite CLI 返回 config:pull is not a heroku command.

【问题讨论】:

    标签: python heroku environment-variables


    【解决方案1】:

    因为您正在执行一个命令(除了env 或类似的东西)来获取这些配置变量,这意味着它们很可能不在您的正常环境中,这意味着您无法通过os.environ.get() 获取它们。

    您可以做的是从该命令的输出中提取它们(示例 - python 2.7 - 假设它们出现在stdout,如果它们不是也以同样的方式检查stderr) :

    from subprocess import Popen, PIPE
    
    graphenedb_url = graphenedb_user = graphenedb_pass = None
    stdout, stderr = Popen(['heroku', 'config'], stdout=PIPE, stderr=PIPE).communicate()
    for line in stdout.split('\n'):
        split = line.split(':')
        if len(split) == 2:
            if split[0] == 'GRAPHENEDB_BOLT_URL':
                graphenedb_url = split[1].strip()
            elif split[0] == 'GRAPHENEDB_BOLT_USER':
                graphenedb_user = split[1].strip()
            elif split[0] == 'GRAPHENEDB_BOLT_PASSWORD':
                graphenedb_pass = split[1].strip()
    print graphenedb_url
    print graphenedb_user
    print graphenedb_pass
    

    注意事项:

    • 例子是python 2.7
    • 它假定信息来自stdout,如果没有检查stderr,同样方式
    • 您可能需要使用 heroku 可执行文件的完整路径,不确定。

    【讨论】:

    • 这对我有用——谢谢!但我不明白答案的第一段。我使用heroku local 命令运行我的应用程序,您认为它会应用正确的环境,但它并没有像我预期的那样填充os.environ
    • 我的意思是env|grep GRAPHENEDB 不会显示变量,这意味着它们不在环境中。事实上,我也希望 heroku local 设置环境将其传递给应用程序启动。
    • 您的评论帮助我理解了——谢谢。但是,我必须报告答案中的解决方法在部署到 Heroku 的 Python 应用程序上失败,因为 Heroku 不允许 shell 命令。我仍然很困惑为什么我无法通过os.environ 访问 Heroku“配置”变量。
    • 当您说变量“不在您的正常环境中”时,您所说的“正常环境”是什么意思?这些变量是在哪里定义的?像加载环境变量这样简单的事情需要这样的解决方法似乎真的很奇怪。
    • @DarksteelPenguin:我的意思是正常 shell 执行设置的环境(通过 .rc 文件)——如果你需要执行某个 cmd 来将它们加载到环境中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2020-12-12
    • 2020-09-04
    • 2018-09-03
    • 2017-04-05
    • 2014-03-16
    相关资源
    最近更新 更多