【问题标题】:Sending composite data type with XML-RPC using cPickle使用 cPickle 通过 XML-RPC 发送复合数据类型
【发布时间】:2011-05-02 12:53:16
【问题描述】:

我正在做一个分布式处理项目。 我需要将我的复合数据类型发送给另一个对等点,这样我就可以在其他对等点中使用它来填充我的 TreeView 结构。 我的“tsk_composite”模块中有这两个类, 我的复合数据节点:

class CTskNode(object):    
    def __init__(self, pData, pParent = None):
        self.mData = pData        
        self.mParent = pParent        
        self.mChildren = []   

我的主类发送树结构的RootNode:

class CTskComposite(object):
...
def getRootNode(self):
        self.getImagePartitions()
        return self.mParent  

def getImagePartitions(self):
    #I use this method to create my parentRoot with recursive function
    #it works good

我使用 cPickle 和这段代码发送我的复合数据:

def _composite(self, pArgs):
    self.mComposite = CTskComposite(pArgs)
    self.mCompositeRootNode = self.mComposite.getRootNode()
    return cPickle.dumps(self.mCompositeRootNode) 

当我在第二个对等方中收到复合数据时,它会给出以下错误消息:

ImportError: No module named tsk_composite

当我在我的第二个对等方中创建一个名为“tsk_composite”的 emty 模块时,它会给出这个错误:

AttributeError: 'module' object has no attribute 'CTskNode'

当我刚刚在我的第二个同行的模块中编写这行代码时,它运行良好。

class CTskNode(object):pass

其实我不需要这个模块和类,我怎样才能通过 cpickle 将模块和类名导入其他对等点?

【问题讨论】:

    标签: python xml-rpc pickle composite importerror


    【解决方案1】:

    当 Pickle 序列化一个对象时,它会序列化一个存储属性名称/值和类名(全名,带有模块路径)的字典,而不是方法定义。

    反序列化时,它会重新创建一个具有相同类的对象,并将保存的属性设置为该对象。

    要重新创建对象,pickle 尝试在客户端导入该类,如果它不存在,它将引发您看到的异常。

    为了避免这种情况,我看到了 2 个解决方案:

    • 您必须使源对您的客户端模块可用,因此在解开对象时它会找到源。
    • 您可以重新创建一个虚拟模块(具有相同的路径、类名和属性)(如果这些对象的唯一需要是属性处理)

    【讨论】:

    • 感谢您的快速回复。但是,我无法将我的资源提供给我的客户同行,而且这似乎不是创建我真的不需要的虚拟模块的好方法。除了 pickle 之外,您还有其他建议使用 XML-RPC 从一个对等方发送数据吗?
    • 你可以尝试发送一个由属性名和值组成的字典,应该足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2010-12-12
    相关资源
    最近更新 更多