我在一个站点上安装了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
是否会再次安装此插件并尝试导入/导出我的网站工作,还是有其他修复方法?
感谢。
答案 0 :(得分:2)
在导入过程中,ZODB必须重新映射转储的pickle中的持久ID,并且必须“加载”导出文件中的所有条目。
在重映射过程中,它将尝试导入每个引用的类。您的导出仍然保留对collective.formcriteria
类的引用,这就是导入过程中出现错误的原因。
您可以做两件事:
将collective.formcriteria
安装到您的buildout中,只是为了让此导入正常工作。无需运行安装代码或任何东西,Zope进程只需要能够在导入过程中导入类。之后您可以将其删除。
使用空存根填写缺少的导入。这需要更多一些,因为您需要创建一个虚拟模块,您将插入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
package layout,您很可能需要存根更多此类。
使用此技术不会删除损坏的引用;它只允许您将.zexp
文件导入新实例。