安装附加组件时出现PicklingError

问题描述:

我被授予将Plone站点从3.1.7升级到4.0.3的任务。我已经成功地得到升级的站点,但现在我想安装collective.lineage,我得到以下错误:安装附加组件时出现PicklingError

Traceback (innermost last):
Module ZPublisher.Publish, line 135, in publish
Module Zope2.App.startup, line 291, in commit
Module transaction._manager, line 93, in commit
Module transaction._transaction, line 322, in commit
Module transaction._transaction, line 416, in _commitResources
Module ZODB.Connection, line 558, in commit
Module ZODB.Connection, line 606, in _commit
Module ZODB.Connection, line 640, in _store_objects
Module ZODB.serialize, line 422, in serialize
Module ZODB.serialize, line 431, in _dump
PicklingError: Can't pickle <class 'quills.app.portlets.quillslinks.IQuillsLinksPortlet'> : import of module quills.app.portlets.quillslinks failed

鹅毛笔在升级之前安装,但没有被利用在网站上所以我通过快速安装程序卸载它,同时该网站仍然是3.1.7(我不相信羽毛笔有卸载配置文件)。

此外,这个错误不会影响所有的附加组件,昨天我没有发生意外安装了collective.redirect。

很明显,奎斯并没有彻底卸载,但老实说,当修复这个问题时不知道从哪里开始。

任何帮助将不胜感激。

它看起来像我一样,当Quills被移除时,Quills分配了一些portlet,这些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 

这最后解决方案应该被认为是一个丑陋的黑客,但。