【问题标题】:pickle can't import a module that exists?pickle 无法导入存在的模块?
【发布时间】:2011-05-18 20:05:47
【问题描述】:

为什么会发生这种情况?

import window; print "LOADED"; data = cPickle.loads(data)

结果是:

LOADED
Traceback (most recent call last):
...
    import window; print "LOADED"; data = cPickle.loads(data)
exceptions.ImportError: No module named window

如果我使用import window,它会很好地加载模块,但是当使用cPickle 加载时,它似乎不起作用。

对于一些可能相关的附加信息:

我保存文件的模块位于project1\MODULE\submodule\main.pywindow 模块是 project1\MODULE\window.pymain.py 开始:

import sys
sys.path.append("..\\..")
sys.path.append("..")
...
import window

我尝试从中加载的模块位于project2\project2sub\MODULE\data.py 中,不会与sys 路径混淆。

MODULE 在这两种情况下都是一样的:我要加载的模块是project2\project2sub\MODULE\window.py

sys.path 附加会不会搞砸?

【问题讨论】:

  • 什么是IN“数据”?腌制的是什么?

标签: python module import pickle


【解决方案1】:

Pickle 取决于模块路径。无论您如何加载模块,如果您不搞乱sys.path,泡菜加载和保存应该可以工作。但是,如果您在一个地方执行import module.foosys.path.append('module'); import foo,您有两个不同的模块路径:在第一个实例中,模块路径是module.foo,而在第二个实例中它只是foo。这些不是等效的,这会阻止泡菜正常工作。

【讨论】:

  • 天哪,你的解释解决了我持续一周的问题。我的错误正是你所描述的。即使我的子文件夹下有 init 文件,我也无法导入这些文件。然后我申请了 sys.path.append 解决方案。事实证明,它引起了更大的问题!衷心感谢。
【解决方案2】:

检查以确保您在加载程序中导入类的方式与在保存程序中的方式相同。

保存:

 import window
 myObj.window_obj = window.wObj

加载中

 import window
 myObj = cPickle.loads(data)

不是:

保存:

 from window import wObj
 myObj.window_obj = wObj

加载中:

 import window
 myObj = cPickle.loads(data)

【讨论】:

  • 我觉得这两个都行。我认为问题在于我做了import module.foo(有效)。在另一个我做了sys.path.append('module'); import foo(有效)。因此路径是不同的(foomodule/foo),这就搞砸了。
  • @Claudiu:我有同样的问题(和解决方案)你能把这个作为答案发布并接受吗? (以便其他人可以找到)
猜你喜欢
  • 2012-02-06
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2021-07-27
  • 2019-06-13
相关资源
最近更新 更多