【发布时间】:2015-04-25 03:30:37
【问题描述】:
我在 supervisord 中设置了一个环境变量:
[program:worker]
directory = /srv/app/
command=celery -A tasks worker -Q default -l info -n default_worker.%%h
environment=BROKER="amqp://admin:password@xxxxx:5672//"
在我的 celeryconfig.py 中,然后我尝试像这样读取该变量。
BROKER = os.environ['BROKER']
但我还是得到了下面错误的关键,为什么?
File "/usr/local/lib/python2.7/dist-packages/celery/loaders/base.py", line 106, in import_module
return importlib.import_module(module, package=package)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/srv/app/celeryconfig.py", line 6, in <module>
BROKER = os.environ['BROKER']
File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__
raise KeyError(key)
KeyError: 'BROKER
如 cmets 中所建议的,有一个环境文件转储:
{
'SUPERVISOR_GROUP_NAME': 'celery_default_worker',
'TERM': 'linux',
'SUPERVISOR_SERVER_URL': 'unix: ///var/run/supervisor.sock',
'UPSTART_INSTANCE': '',
'RUNLEVEL': '2',
'UPSTART_EVENTS': 'runlevel',
'PREVLEVEL': 'N',
'SUPERVISOR_PROCESS_NAME': 'celery_default_worker',
'UPSTART_JOB': 'rc',
'PWD': '/',
'SUPERVISOR_ENABLED': '1',
'runlevel': '2',
'PATH': '/usr/local/sbin: /usr/local/bin: /sbin: /bin: /usr/sbin: /usr/bin',
'previous': 'N'
}
【问题讨论】:
-
奇怪 - 第一次看起来确实正确。将
with open("/tmp/celery-environment.txt", "w") as f: f.write(repr(os.environ))添加到celeryconfig.py,然后检查/tmp/celery-environment.txt文件以查看您的环境中的是什么,这可能有助于您的调试? -
确认执行顺序。即检查是否首先在
supervisord:中设置环境变量BROKER 或在CeleryConfig.py中首先读取BROKER。如果先读取CeleryConfig.py,则不存在BROKER,因为在supervisord:中设置了BROKER -
您是否告诉
supervisord接受更改,或者重新启动supervisord? -
另外,还有这个错误:github.com/Supervisor/supervisor/issues/91 和 github.com/Supervisor/supervisor/pull/550 请检查您的 supervisord 版本,以了解这些补丁何时被接受。
-
@qarma:只有在环境变量值部分有空格或其他元值时才需要引用。
标签: python django celery supervisord