【问题标题】:Cannot read environment variable in Python on Ubuntu无法在 Ubuntu 上读取 Python 中的环境变量
【发布时间】:2015-02-22 14:57:30
【问题描述】:

我设置了一个环境变量,我使用 .sh 文件在本地执行:

.sh file:
#!/bin/sh
echo "environment variables"
export BROKER="amqp://admin:password@11.11.11.11:4672//"

在虚拟环境中本地我现在可以在 Python 中使用:

BROKER = os.environ['BROKER']

但是,在我的生产服务器 (Ubuntu) 上。我运行同一个文件 chmod +x name_of_file.sh 和 source settings.sh 并可以使用 printenv 查看变量,但 Python 给出了错误 KeyError: 'BROKER' 为什么?

这只会发生在我的生产机器上,尽管我可以使用printenv 查看变量。请注意,我的生产机器不使用 virtualenv。

如果我在 Ubuntu 上运行 python shell 并执行os.environ['BROKER'],它会打印出正确的值。所以我不知道应用文件找不到它。

这是无法找到变量的运行任务(主管任务)

[program:celery]
directory = /srv/app_test/
command=celery -A tasks worker -l info
stdout_logfile = /var/log/celeryd_.log
autostart=true
autorestart=true
startsecs=5
stopwaitsecs = 600
killasgroup=true
priority=998
user=ubuntu

Celery Config(在supervisor下执行时找不到变量:

from kombu import Exchange, Queue
import os

# Celery Settings

BROKER = os.environ['BROKER']

当我重新启动主管时,它给出了关键错误。

【问题讨论】:

  • 你得到的错误表明你正在做os.environ['BROKER_URL'],而不是os.environ['BROKER']。
  • 因为你定义的变量叫BROKER,而不是BROKER_URL?
  • 对不起,这是 OP 中的错字,我会更新,这不是问题。
  • 只是为了检查:你是如何在生产服务器上调用命令的(我想到的两件大事是 A)sudo 经常被配置为删除所有 env 变量,以及 B)在 WSGI 后面运行或者需要通过其他步骤才能将环境放入该空间
  • 什么是“应用文件”?您的问题缺少很多信息。发布一些可以重现问题的代码。

标签: python python-2.7 environment-variables celery


【解决方案1】:

您的 shell 中的环境变量将不在主管任务中可见。

您需要在您的主管配置中使用environment 设置:

[program:celery]
...
environment=BROKER="amqp://admin:password@11.11.11.11:4672//"

这需要supervisor 3.0+.

【讨论】:

  • 本地和生产之间的唯一区别是主管,所以我想这就是问题所在。如何让主管任务查看我的环境?
  • 这是误导或我读错了:“子进程将继承用于启动 supervisord 程序的 shell 的环境。” supervisord.org/subprocess.html#subprocess-environment
  • 它们继承启动supervisord的父进程在启动时给supervisord的环境。谁说你的 shell 环境变量是在启动时给 supervisord 的?
  • 我明白了,反正我能做到吗?如果没有,没关系,我现在明白了。
  • 是的,您“可以”这样做,但是您必须在每次服务器重启后自己监督 supervisord,依此类推。把变量写在config文件里就行了,最简单的方法。
猜你喜欢
  • 2019-11-21
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2014-08-16
  • 2019-07-16
  • 2013-06-07
  • 1970-01-01
  • 2015-07-17
相关资源
最近更新 更多