pickle 无法导入存在的模块?

发布于 2024-11-08 07:35:52 字数 913 浏览 5 评论 0原文

为什么会发生这种情况?

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.py 中。 window 模块是 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 是否会以某种方式搞乱这个?

Why might this happen?

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

The result is:

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

It loads the module fine if I do import window, but when loading with cPickle it doesn't seem to work.

For some additional info which is likely relevant:

The module I saved the file in is in project1\MODULE\submodule\main.py. The window module is project1\MODULE\window.py. main.py begins:

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

The module I'm attempting to load from is in project2\project2sub\MODULE\data.py, with no messing with the sys path.

MODULE is the same in both cases: the module I want to load is project2\project2sub\MODULE\window.py.

Could the sys.path appending mess this up somehow?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

哭泣的笑容 2024-11-15 07:35:52

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

Pickle depends upon the module path. No matter how you load modules, if you don't mess with sys.path, pickle loading and saving should work. However, if you do import module.foo in one place, and sys.path.append('module'); import foo, you have two different module paths: in the first instance the module path is module.foo while in the second it is just foo. These are not equivalent and that'll prevent pickle from working properly.

墨落画卷 2024-11-15 07:35:52

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

保存:

 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)

Check to make sure that you're importing classes in the loading programing in the same manner as you are in the saving program.

Saving:

 import window
 myObj.window_obj = window.wObj

Loading

 import window
 myObj = cPickle.loads(data)

NOT:

Saving:

 from window import wObj
 myObj.window_obj = wObj

Loading:

 import window
 myObj = cPickle.loads(data)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文