2010-10-01 98 views
0

我想在multiprocessing.Queue上放一个scapy.layers.dhcp.BOOTP的实例。每次我打电话put()以下异常occures:不能把对象放在队列上

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()也失败的实例。但为什么这个班不适合挑选?

对于那些没有谁Scapy的安装:

class BOOTP(Packet): 
    name = "BOOTP" 
    fields_desc = [ ByteEnumField("op",1, {1:"BOOTREQUEST", 2:"BOOTREPLY"}), 
        ByteField("htype",1), 
        ByteField("hlen",6), 
        ByteField("hops",0), 
        IntField("xid",0), 
        ShortField("secs",0), 
        FlagsField("flags", 0, 16, "???????????????B"), 
        IPField("ciaddr","0.0.0.0"), 
        IPField("yiaddr","0.0.0.0"), 
        IPField("siaddr","0.0.0.0"), 
        IPField("giaddr","0.0.0.0"), 
        Field("chaddr","", "16s"), 
        Field("sname","","64s"), 
        Field("file","","128s"), 
        StrField("options","") ] 
    def guess_payload_class(self, payload): 
     if self.options[:len(dhcpmagic)] == dhcpmagic: 
      return DHCP 
     else: 
      return Packet.guess_payload_class(self, payload) 
    def extract_padding(self,s): 
     if self.options[:len(dhcpmagic)] == dhcpmagic: 
      # set BOOTP options to DHCP magic cookie and make rest a payload of DHCP options 
      payload = self.options[len(dhcpmagic):] 
      self.options = self.options[:len(dhcpmagic)] 
      return payload, None 
     else: 
      return "", None 
    def hashret(self): 
     return struct.pack("L", self.xid) 
    def answers(self, other): 
     if not isinstance(other, BOOTP): 
      return 0 
     return self.xid == other.xid 

是否有任何其他方式“运输”这种情况下另一个子?

回答

1

嗯,问题是,你不能pickle功能类型。这就是你在做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所需的所有参数,而不是实例来避免该问题?

+0

我复制了所有相关的属性到一个新的,自己创建的对象,因为我没有找到另一种解决方案。 – 2010-10-05 21:52:53

0

,可以帮助诊断这类问题的另一件事是使用咸菜模块代替cPickle的(必须得到由queues.py隐含使用)

我也有类似的情况,得到一个完全无益消息,

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

我徘徊到调试器,找到的对象被酸洗,并试图将其传递给

pickle.dump(myobj,open('outfile','w'),-1) 

和得到了更多帮助:

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

哪一个更直接地指向有问题的代码。

0

我用的解决方案是str中的数据包,然后把它放在队列...