安装附加组件时的PicklingError

时间:2011-03-24 17:40:42

标签: portlet uninstall plone

我被赋予了将plone站点从3.1.7升级到4.0.3的任务。我已成功升级网站,但现在我正在尝试安装collective.lineage,我收到以下错误:

  

追溯(最里面):
     模块ZPublisher.Publish,第135行,在发布中      模块Zope2.App.startup,第291行,在提交中      模块transaction._manager,第93行,在提交中      模块transaction._transaction,第322行,在提交中      模块transaction._transaction,第416行,在_commitResources中      模块ZODB.Connection,第558行,在提交中      模块ZODB.Connection,第606行,在_commit中      模块ZODB.Connection,第640行,在_store_objects中      模块ZODB.serialize,第422行,序列化
     模块ZODB.serialize,第431行,在_dump中      PicklingError:无法腌制<class 'quills.app.portlets.quillslinks.IQuillsLinksPortlet'>:导入模块quills.app.portlets.quillslinks失败

Quills是在升级之前安装的,但是没有在网站上使用,所以我通过quickinstaller在网站仍然是3.1.7的情况下卸载它(我不相信quills有卸载配置文件)。

此外,此错误不会影响所有加载项,我昨天安装了collective.redirect而没有发生任何事故。

显然,Quills没有干净地卸载,但老实说,在修复此问题时不知道从哪里开始。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

在我看来,Quills在删除Quills时在某处分配了一些未分配的portlet。

最好的解决方案是在删除Quills之前删除这些portlet。不幸的是,我不知道有一个工具可以概述portlet的分配位置,并且可以一目了然地识别出有问题的portlet,以便你可以删除它。也许别人知道这样的工具?

您可以尝试使用portal_setup工具导出portlet配置;生成的portlets.xml可能包含有关此portlet或portlet的分配位置的信息。

或者不是找到并删除portlet,而是可以尝试注册正在破坏的接口的虚拟替换(这应该包含在实例中某些产品的初始化代码中):

import imp, sys
from zope.interface import Interface
m = imp.new_module('quills.app.portlets.quillslinks')
sys.modules['quills.app.portlets.quillslinks'] = m
m.IQuillsLinksPortlet = Interface

但是,最后的解决方案应该被视为丑陋的黑客攻击。