1

我在站点上安装了collective.formcriteria,然后将其从Buildout中卸载并删除。

当我导出我的网站时它工作正常,但尝试导入该网站会给我这个错误:

Traceback (innermost last):

    Module ZPublisher.Publish, line 127, in publish
    Module ZPublisher.mapply, line 77, in mapply
    Module ZPublisher.Publish, line 47, in call_object
    Module OFS.ObjectManager, line 628, in manage_importObject
    Module OFS.ObjectManager, line 646, in _importObjectFromFile
    Module ZODB.ExportImport, line 92, in importFile
    Module transaction._transaction, line 253, in savepoint
    Module transaction._transaction, line 250, in savepoint
    Module transaction._transaction, line 647, in __init__
    Module ZODB.Connection, line 1128, in savepoint
    Module ZODB.Connection, line 570, in _commit
    Module ZODB.ExportImport, line 175, in _importDuringCommit

ImportError: No module named formcriteria.criteria.relativepath

会再次安装此插件并尝试导入/导出我的网站工作还是有其他修复?

谢谢。

4

1 回答 1

2

在导入期间,ZODB 必须重新映射转储的 pickle 中的持久 id,为此它必须“加载”导出文件中的所有条目。

因此,在重新映射过程中,它将尝试导入每个引用的类。您的导出仍然包含对collective.formcriteria类的引用,这就是您在导入期间收到错误的原因。

你可以做两件事:

  1. 安装collective.formcriteria到您的构建中,只是为了让这个导入工作。不需要运行安装代码或任何东西,Zope 进程只需要能够在导入过程中导入类。之后您可以再次删除它。

  2. 用空存根填充缺失的导入。这涉及更多,因为您需要创建一个虚拟模块,您将插入该模块sys.modules以为此过程加载。

    虚拟模块可能如下所示;我将其命名为“placeholder.py”:

    from persistent import Persistent
    
    class PlaceHolderClass(Peristent):
        def __repr__(self):
            return "<Persistent placeholder class for now-removed instances>"
    

    你用以下方法剔除丢失的导入:

    import sys
    import placeholder
    
    sys.modules['collective.formcriteria.criteria.relativepath'] = placeholder
    
    placeholder.FormRelativePathCriterion = placeholder.PlaceHolderClass
    

    collective.formcriteria根据包布局,您很可能需要存根更多此类类。

    使用此技术不会删除损坏的引用;它只会让您将.zexp文件导入新实例。

于 2012-06-22T12:18:58.423 回答