PyInstaller打包Celery任务生产者为exe后缺失celery.fixups模块如何解决
解决方案
完全可以将Celery任务发送脚本编译为可执行文件,实现向远程Worker发任务的需求。你遇到的报错是PyInstaller无法识别Celery动态导入的隐式依赖导致的,按以下步骤操作即可解决:
步骤1:修正生产者代码
修改Celery初始化配置,禁用不必要的fixups模块自动加载,同时修正Celery实例的参数格式:
from celery import Celery def main(): print('Sending Task') # 第一个参数为自定义的应用名称,后续参数明确指定broker、backend,禁用不需要的fixups celery = Celery( 'remote_task_producer', broker='redis://:password@redis_server:6379/0', backend='redis://:password@redis_server:6379/0', set_default=False, fixups=[] ) celery.send_task('tasks.add', (2,2)) if __name__=="__main__": main()
步骤2:调整PyInstaller打包参数
打包时手动指定Celery、kombu相关的隐藏导入模块,命令如下:
pyinstaller -F --hidden-import="celery.fixups" --hidden-import="celery.fixups.django" --hidden-import="kombu.transport.redis" sendtask.py
可选优化:持久化打包配置
如果需要频繁打包,可以将隐藏导入配置写入spec文件,避免每次重复输入参数:
- 先生成初始spec文件:
pyi-makespec -F sendtask.py - 编辑生成的
sendtask.spec文件,找到hiddenimports字段,修改为:hiddenimports=['celery.fixups', 'celery.fixups.django', 'kombu.transport.redis'] - 后续直接用spec文件打包:
pyinstaller sendtask.spec
验证
打包完成后,运行dist目录下的exe文件,即可正常向远程Celery Worker发送任务,无缺失模块报错。
内容的提问来源于stack exchange,提问作者José Oliveira
相关产品推荐
相关产品推荐

