无法将对象放在Queu上

2024-04-19 13:41:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把scapy.layers.dhcp.BOOTP的实例放在multiprocessing.Queue上。每次调用put()时,都会发生以下异常:

Traceback (most recent call last):
  File "/usr/lib/python2.6/multiprocessing/queues.py", line 242, in _feed
    send(obj)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

当然,尝试直接使用pickle.dumps()来pickle实例也会失败。但为什么这个类不可挑选?在

对于所有没有安装scapy的用户:

^{pr2}$

是否有其他方法可以将此实例“传输”到另一个子流程?在


Tags: 实例mostqueueputlayersfunctioncallmultiprocessing
3条回答

好吧,问题是你不能腌制函数类型。这是你做type(some_user_function)时得到的。看到这个:

>>> import types
>>> pickle.dumps(types.FunctionType)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'picke' is not defined
>>> pickle.dumps(types.FunctionType)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\lib\pickle.py", line 1366, in dumps
    Pickler(file, protocol).dump(obj)
  File "C:\Python26\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "C:\Python26\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python26\lib\pickle.py", line 748, in save_global
    (obj, module, name))
pickle.PicklingError: Can't pickle <type 'function'>: it's not found as __built
n__.function

因此,这样的函数类型存储在您尝试发送的对象的某个地方。它不在你粘贴的代码中,所以我猜它在超类上。在

也许您可以简单地发送创建scapy.layers.dhcp.BOOTP实例所需的所有参数,而不是实例来避免这个问题?在

另一个有助于诊断此类问题的方法是使用pickle模块而不是cPickle(它必须由队列.py)在

我也遇到过类似的情况,得到了一个完全没有帮助的信息

Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

我漫游到调试器中,发现对象正在被pickle,并尝试将其传递给

^{pr2}$

得到了一个更有用的:

PicklingError: Can't pickle <function findAllRefs at 0x105809f50>: 
   it's not found as buildsys.repoclient.findAllRefs

它更直接地指向有问题的代码。在

我使用的一个解决方案是str包,然后把它放到队列中。。。在

相关问题 更多 >