Python Can';t在Windows 10上用“启动芹菜工人”;PicklingError";

Python Can';t在Windows 10上用“启动芹菜工人”;PicklingError";,python,python-2.7,celery,Python,Python 2.7,Celery,我有一个在Linux上成功运行的简单测试代码,但它不会在我的Windows10x64计算机上运行 当我试着开始一个芹菜工人,它抱怨了一个无法恢复的错误:PicklingError。(芹菜版本:3.1.20) 在我的芹菜配置中,我已经将序列化设置为“json”,但它仍然没有任何帮助 CELERY_RESULT_SERIALIZER = 'json' CELERY_TASK_SERIALIZER = 'json' CELERY_ACCEPT_CONTENT = ['json'] 以下是完整的错误消

我有一个在Linux上成功运行的简单测试代码,但它不会在我的Windows10x64计算机上运行

当我试着开始一个芹菜工人,它抱怨了一个无法恢复的错误:PicklingError。(芹菜版本:3.1.20)

在我的芹菜配置中,我已经将序列化设置为“json”,但它仍然没有任何帮助

CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
以下是完整的错误消息:

[2016-02-09 15:11:48,532: ERROR/MainProcess] Unrecoverable error: PicklingError("Can't pickle <type 'module'>: it's not found as __builtin__.module",)

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\celery-3.1.20-py2.7.egg\celery\worker\__init__.py", line 206, in start
    self.blueprint.start(self)   
  File "C:\Python27\lib\site-packages\celery-3.1.20-py2.7.egg\celery\bootsteps.py", line 123, in start
    step.start(parent)
  File "C:\Python27\lib\site-packages\celery-3.1.20-py2.7.egg\celery\bootsteps.py", line 374, in start
    return self.obj.start()
  File "C:\Python27\lib\site-packages\celery-3.1.20-py2.7.egg\celery\concurrency\base.py", line 131, in start
    self.on_start()
  File "C:\Python27\lib\site-packages\celery-3.1.20-py2.7.egg\celery\concurrency\prefork.py", line 117, in on_start
    **self.options)
  File "C:\Python27\lib\site-packages\billiard\pool.py", line 972, in __init__
    self._create_worker_process(i)
  File "C:\Python27\lib\site-packages\billiard\pool.py", line 1068, in _create_worker_process
    w.start()
  File "C:\Python27\lib\site-packages\billiard\process.py", line 137, in start
    self._popen = Popen(self)
  File "C:\Python27\lib\site-packages\billiard\forking.py", line 263, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:\Python27\lib\site-packages\billiard\py2\reduction.py", line 84, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Python27\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "C:\Python27\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python27\lib\pickle.py", line 401, in save_reduce
    save(args)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 562, in save_tuple
    save(element)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 548, in save_tuple
    save(element)
  File "C:\Python27\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python27\lib\pickle.py", line 401, in save_reduce
    save(args)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 548, in save_tuple
    save(element)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems
    save(v)
  File "C:\Python27\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python27\lib\pickle.py", line 396, in save_reduce
    save(cls)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 748, in save_global
    (obj, module, name))
PicklingError: Can't pickle <type 'module'>: it's not found as __builtin__.module
[2016-02-09 15:11:48532:ERROR/MainProcess]不可恢复的错误:PicklingError(“无法pickle:找不到它作为内置模块”)
回溯(最近一次呼叫最后一次):
文件“C:\Python27\lib\site packages\cellery-3.1.20-py2.7.egg\cellery\worker\\uuuuuu init\uuuuuu.py”,第206行,在开始处
self.blueprint.start(self)
文件“C:\Python27\lib\site packages\cellery-3.1.20-py2.7.egg\cellery\bootsteps.py”,第123行,在开始处
步骤.开始(父级)
文件“C:\Python27\lib\site packages\cellery-3.1.20-py2.7.egg\cellery\bootsteps.py”,第374行,开始
返回self.obj.start()
文件“C:\Python27\lib\site packages\celery-3.1.20-py2.7.egg\celery\concurrency\base.py”,第131行,在开始处
self.on_start()
文件“C:\Python27\lib\site packages\cellery-3.1.20-py2.7.egg\cellery\concurrency\prefork.py”,第117行,on_start
**自我评价(可选)
文件“C:\Python27\lib\site packages\billiard\pool.py”,第972行,在_init中__
自我创建工作流程(一)
文件“C:\Python27\lib\site packages\billiard\pool.py”,第1068行,在\u create\u worker\u进程中
w、 开始()
文件“C:\Python27\lib\site packages\billiard\process.py”,第137行,在开始处
self.\u popen=popen(self)
文件“C:\Python27\lib\site packages\billiard\forking.py”,第263行,在\uuu init中__
转储(进程对象、到子进程、最高\u协议)
文件“C:\Python27\lib\site packages\billiard\py2\reduce.py”,第84行,转储文件
ForkingPickler(文件、协议).dump(obj)
文件“C:\Python27\lib\pickle.py”,第224行,位于转储文件中
自我保存(obj)
文件“C:\Python27\lib\pickle.py”,第331行,保存
自我保存(obj=obj,*rv)
文件“C:\Python27\lib\pickle.py”,第401行,在save\u reduce中
保存(args)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“C:\Python27\lib\pickle.py”,第562行,在save\u元组中
保存(元素)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“C:\Python27\lib\pickle.py”,第548行,在save\u tuple中
保存(元素)
文件“C:\Python27\lib\pickle.py”,第331行,保存
自我保存(obj=obj,*rv)
文件“C:\Python27\lib\pickle.py”,第401行,在save\u reduce中
保存(args)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“C:\Python27\lib\pickle.py”,第548行,在save\u tuple中
保存(元素)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
保存目录中第649行的文件“C:\Python27\lib\pickle.py”
self.\u batch\u setitems(obj.iteritems())
文件“C:\Python27\lib\pickle.py”,第681行,在批处理设置项中
保存(v)
文件“C:\Python27\lib\pickle.py”,第331行,保存
自我保存(obj=obj,*rv)
文件“C:\Python27\lib\pickle.py”,第396行,在save\u reduce中
保存(cls)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“C:\Python27\lib\pickle.py”,第748行,在save\u global中
(对象、模块、名称))
PicklingError:无法pickle:找不到它作为内置模块

我遇到了同样的问题。奇怪的是,这个问题只存在于Windows上,而在Linux上,芹菜没有任何问题。 结果表明,我需要将配置模块作为名称而不是对象传递:

app.config\u from\u对象('celeryconfig')

而不是

app.config\u from\u对象(celeryconfig)

委员会的解释:

提示 建议使用模块名称,因为这意味着在使用预工作池时不需要序列化模块。如果遇到配置pickle错误,请尝试改用模块名称

显然,芹菜需要在配置作为对象传递时对其进行pickle处理,而该对象在Windows上失败。如果作为模块名传递,它将工作。 谢谢你给我指出了正确的方向@JoyLy

对的补充。
如果要查看配置文件的目标,可以使用
\uuu name\uu
变量

from . import celery_config

celery_app.config_from_object(celery_config.__name__)

打开
C:\Python27\lib\site packages\billiard\forking.py
并抛出一个
导入pdb;pdb.set_trace()
在第263行之前。从痕迹上看,这似乎是决定使用pickle的地方。当你进入调试器时,检查一下发生了什么,应该会提供一些线索。谢谢你的重播。我在第263行之前添加了调试器。这就是我得到的:->转储(进程对象,到子进程,最高的协议)[2016-02-09 16:20:09266:INFO/MainProcess](Pdb)n[2016-02-09 16:20:14244:INFO/mainproces]PicklingError:[2016-02-09 16:20:14244:INFO/MainProcess]Pickling…模块)你说得对,这就是它决定泡菜的地方。有什么解决办法吗?或者是一个解决办法?谢谢你的帮助!一旦进入调试器,就可以使用来检查发生了什么。您还可以评估Python,例如,
print(最高_协议)
以查看它的值。结果表明,这是由我如何加载配置对象引起的。不,它是固定的。谢谢你的帮助!!你能说得更具体些吗?我遇到了同样的问题,如果知道您更改了什么,我会很有帮助,我看不出任何明显的错误。也许您的配置足够简单,可以在没有任何问题的情况下进行修改。