Python 对于Heroku环境变量,os.environ.get()返回None
我通过Heroku设置了一些环境变量来访问GrapheneDB实例。当我使用Heroku CLI命令Python 对于Heroku环境变量,os.environ.get()返回None,python,heroku,environment-variables,Python,Heroku,Environment Variables,我通过Heroku设置了一些环境变量来访问GrapheneDB实例。当我使用Heroku CLI命令Heroku config时,所有环境变量都会按预期返回 例如,“heroku config”返回: GRAPHENEDB\u螺栓密码:一些密码 GraphenedBuBolt\uURL:bolt://hobby-someletters.dbs.graphenedb.com:24786 GraphenedBu螺栓用户:AppNumber GraphenedBu URL:http://appnumb
Heroku config
时,所有环境变量都会按预期返回
例如,“heroku config”
返回:
GRAPHENEDB\u螺栓密码:一些密码
GraphenedBuBolt\uURL:bolt://hobby-someletters.dbs.graphenedb.com:24786
GraphenedBu螺栓用户:AppNumber
GraphenedBu URL:http://appnumbers:some_password@hobby someletters.dbs.graphenedb.com:24789
NEO4J_REST_URL:GraphenedBu URL
但是,当我尝试使用os.environ.get()
方法访问这些环境变量时,所有三个print语句都返回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)
我已经尝试使用来自的解决方案
但当我执行命令时:
heroku配置:拉式--覆盖
CLI返回
config:pull不是heroku命令。
因为您正在执行一个命令(而不是env
或类似的命令)来获取这些配置变量,这意味着它们很可能不在您的正常环境中,这意味着您无法通过os.environ.get()
获取它们
您可以做的是从该命令的输出中提取它们(示例-Python2.7-假设它们出现在stdout
,如果它们没有以相同的方式检查stderr
):
注:
- 示例是Python2.7
- 它假设信息出现在
上,如果不检查stdout
,则以相同的方式进行检查stderr
- 您可能需要为
可执行文件使用完整路径,但不确定heroku
heroku local
命令运行我的应用程序,您可能认为该命令会应用正确的环境,但它没有像我预期的那样填充os.environ
。我的意思是env | grep GRAPHENEDB
不会显示变量,这意味着它们不在环境中。事实上,我还希望heroku local设置环境并将其传递给应用程序发布。您的评论帮助我理解了这一点——谢谢。但是,我必须报告,答案中的解决方法在部署到Heroku的Python应用程序上失败,因为Heroku不允许使用shell命令。我仍然感到困惑,为什么我不能通过os.environ
访问Heroku“config”变量。当你说变量“不在你的正常环境中”时,“正常环境”是什么意思?这些变量是在哪里定义的?对于像加载环境变量这样简单的事情,需要这样一种解决方法,这似乎真的很奇怪。@DarksteelPenguin:我指的是正常shell执行(通过.rc文件)设置的环境,如果您需要执行某个cmd将它们加载到环境中。
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