Skip to main content
 首页 » 编程设计

python之主管目录未传播到 Celery 程序

2025年05月04日13arxive

我有一个需要与 Celery 一起运行的 Django 应用程序(名为 pcycler)。我正在尝试使用 Supervisor 在生产中部署它。

运行时出现错误:

supervisorctl start celery

这给了我:

celery: ERROR (abnormal termination)

这是我的 celery.conf 文件,它在启动时包含在 supervisor.conf 中。

[program:celery] 
command=/webapps/pcyclerenv/bin/celery -A pcycler worker -l info  
 
directory=/webapps/pcyclerenv/pcycler 
user=pcycleruser 
numprocs=1 
stdout_logfile=/webapps/pcyclerenv/logs/celeryd_stdout.log 
stderr_logfile=/webapps/pcyclerenv/logs/celeryd_stderr.log 
redirect_stderr=false 
autostart=true 
autorestart=true 
startsecs=10 
stopwaitsecs=600 
killasgroup=true 
priority=998 

celeryd_stderr.log 的内容是:

Traceback (most recent call last): 
  File "/webapps/pcyclerenv/bin/celery", line 11, in <module> 
    sys.exit(main()) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/__main__.py", line 30, in main 
    main() 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/bin/celery.py", line 81, in main 
    cmd.execute_from_commandline(argv) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/bin/celery.py", line 769, in execute_from_commandline 
    super(CeleryCommand, self).execute_from_commandline(argv))) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/bin/base.py", line 304, in execute_from_commandline 
    argv = self.setup_app_from_commandline(argv) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/bin/base.py", line 464, in setup_app_from_commandline 
    self.app = self.find_app(app) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/bin/base.py", line 484, in find_app 
    return find_app(app, symbol_by_name=self.symbol_by_name) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/app/utils.py", line 222, in find_app 
    sym = symbol_by_name(app, imp=imp) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/bin/base.py", line 487, in symbol_by_name 
    return symbol_by_name(name, imp=imp) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/kombu/utils/__init__.py", line 92, in symbol_by_name 
    module = imp(module_name, package=package, **kwargs) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/utils/imports.py", line 101, in import_from_cwd 
    return imp(module, package=package) 
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
ImportError: No module named pcycler 

自然地,我决定自己运行这个程序,看看我是否能重现这个错误:

pcycleruser@raspberrypi:/webapps/pcyclerenv/pcycler$ pwd 
/webapps/pcyclerenv/pcycler 
 
pcycleruser@raspberrypi:/webapps/pcyclerenv/pcycler$ /webapps/pcyclerenv/bin/celery -A pcycler worker -l info 
 
(... text and pickle deprecation warnings ...) 
 
[2014-05-23 14:52:36,053: WARNING/MainProcess] /webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/fixups/django.py:233: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments! 
  warnings.warn('Using settings.DEBUG leads to a memory leak, never ' 
 
[2014-05-23 14:52:36,066: WARNING/MainProcess] celery@raspberrypi ready. 

这样就可以了。但是,当我在错误的目录下时,例如:

pcycleruser@raspberrypi:/webapps/pcyclerenv/pcycler$ cd .. 
 
pcycleruser@raspberrypi:/webapps/pcyclerenv$ pwd 
/webapps/pcyclerenv 
 
pcycleruser@raspberrypi:/webapps/pcyclerenv$ /webapps/pcyclerenv/bin/celery -A pcycler worker -l info 
 
Traceback (most recent call last): 
  File "/webapps/pcyclerenv/bin/celery", line 11, in <module> 
    sys.exit(main()) 
  File "/webapps/pcyclerenv/local/lib/python2.7/site-packages/celery/__main__.py", line 30, in main 
    main() 
 
(... exact same error as above ...) 
 
ImportError: No module named pcycler 

我收到与错误日志中完全相同的错误!这让我假设当我在主管中运行时目录没有正确更改。

tldr:当我使用 supervisorctl 运行命令时,为什么我的 supervisor.conf 中的目录没有被应用?

请您参考如下方法:

发现错误,真的很蠢。

主管 conf 文件是特定于订单的,所以这样做:

[program:celery] 
directory=/webapps/pcyclerenv/pcycler 
command=/webapps/pcyclerenv/bin/celery -A pcycler worker -l info  
(... the rest ..) 

解决了我遇到的问题。