我在my_module定义了一个类MyClass 。 MyClass有一个方法pickle_myself ,它腌制有问题的类的实例:
def pickle_myself(self,pkl_file_path): with open(pkl_file_path,'w+') as f: pkl.dump(self,f,protocol=2)
我已经确定my_module是在PYTHONPATH 。 在解释器中,执行__import__('my_module')工作正常:
>>> __import__('my_module') <module 'my_module' from 'A:my_stuffmy_module.pyc'>
但是,最终加载文件时,我得到:
file "A:Anacondalibpickle.py",line 1128,in find_class __import__(module) importError: No module named my_module
有些事情我已经确定了:
取消存储在networking驱动器上的大型对象
如何在离线linux机器上安装nltk的english.pickle
cPickle:SystemError:错误返回,没有例外设置
是否有任何指标,已知的问题,或保存一个大的泡菜对象到windows 10文件系统的方向
无法取消在windows上腌制的Mac上的文件
我没有改变my_module.py的位置( 改变模块的目录之后的Python酸洗 )
我试图使用dill ,而是仍然得到相同的错误( 更多关于python importerror没有模块命名 )
编辑 – 一个玩具的例子,再现错误:
这个例子本身遍布在一堆文件上。
首先,我们有模块ball (存储在一个名为ball.py的文件中):
class Ball(): def __init__(self,ball_radius): self.ball_radius = ball_radius def say_hello(self): print "Hi,I'm a ball with radius {}!".format(self.ball_radius)
然后,我们有模块test_environment :
import os import ball #import dill as pkl import pickle as pkl class Environment(): def __init__(self,store_dir,num_balls,default_ball_radius): self.store_dir = store_dir self.balls_in_environment = [ball.Ball(default_ball_radius) for x in range(num_balls)] def persist(self): pkl_file_path = os.path.join(self.store_dir,"test_stored_env.pkl") with open(pkl_file_path,protocol=2)
然后,我们有一个模块,它具有构build环境的function,可以持久化并加载它们,称为make_persist_load :
import os import test_environment #import pickle as pkl import dill as pkl def make_env_and_persist(): cwd = os.getcwd() my_env = test_environment.Environment(cwd,5,5) my_env.persist() def load_env(store_path): stored_env = None with open(store_path,'rb') as pkl_f: stored_env = pkl.load(pkl_f) return stored_env
然后我们有一个脚本把它放在一起,在test_serialization.py :
import os import make_persist_load MAKE_AND_PERSIST = True LOAD = (not MAKE_AND_PERSIST) cwd = os.getcwd() store_path = os.path.join(cwd,"test_stored_env.pkl") if MAKE_AND_PERSIST == True: make_persist_load.make_env_and_persist() if LOAD == True: loaded_env = make_persist_load.load_env(store_path)
为了便于使用这个玩具的例子, 我把它放在一个Github仓库中,只需要克隆到你select的目录。 。 请参阅包含说明的README ,我也在这里重现:
说明:
1)克隆库到一个目录。
2)将存储库目录添加到PYTHONPATH。
3)打开test_serialization.py ,并将variablesMAKE_AND_PERSIST设置为True 。 在解释器中运行脚本。
4)closures以前的解释器实例,并启动一个新的解释器实例。 在test_serialization.py ,将MAKE_AND_PERSIST更改为False ,并将以编程方式将LOAD设置为True 。 在解释器中运行脚本,导致importError: No module named test_environment 。
5)默认情况下,testing设置为使用莳萝,而不是腌菜。 为了改变这个,进入test_environment.py和make_persist_load.py ,根据需要更改导入。
编辑:切换到莳萝0.2.5.dev0后, dill.detect.trace(True)输出
C2: test_environment.Environment # C2 D2: <dict object at 0x000000000A9BDAE8> C2: ball.Ball # C2 D2: <dict object at 0x000000000AA25048> # D2 D2: <dict object at 0x000000000AA25268> # D2 D2: <dict object at 0x000000000A9BD598> # D2 D2: <dict object at 0x000000000A9BD9D8> # D2 D2: <dict object at 0x000000000A9B0BF8> # D2 # D2
编辑:当在Mac / Ubuntu上运行时(例如类Unix系统?),玩具示例运行得非常好。 它只在windows上失败。
我可以从你的问题中知道,你可能正在做这样的事情,用一个类方法试图腌制类的实例。 这样做是不明智的,如果你这样做的话…在类的外部使用pkl.dump更为理智( pkl.dump是pickle或dill等)。 但是,它仍然可以使用这个设计,见下面:
>>> class Thing(object): ... def pickle_myself(self,pkl_file_path): ... with open(pkl_file_path,'w+') as f: ... pkl.dump(self,protocol=2) ... >>> import dill as pkl >>> >>> t = Thing() >>> t.pickle_myself('foo.pkl')
然后重新启动…
Python 2.7.10 (default,Sep 2 2015,17:36:25) [GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin Type "help","copyright","credits" or "license" for more information. >>> import dill >>> f = open('foo.pkl','r') >>> t = dill.load(f) >>> t <__main__.Thing object at 0x1060ff410>
如果你有一个更复杂的课程,我相信你可能会遇到麻烦,特别是如果这个课程使用另一个坐在同一目录下的文件。
>>> import dill >>> from bar import Zap >>> print dill.source.getsource(Zap) class Zap(object): x = 1 def __init__(self,y): self.y = y >>> >>> class Thing2(Zap): ... def pickle_myself(self,'w+') as f: ... dill.dump(self,protocol=2) ... >>> t = Thing2(2) >>> t.pickle_myself('foo2.pkl')
然后重新启动…
Python 2.7.10 (default,"credits" or "license" for more information. >>> import dill >>> f = open('foo2.pkl','r') >>> t = dill.load(f) >>> t <__main__.Thing2 object at 0x10eca8090> >>> ty 2 >>>
那么…拍,这也是有效的。 你将不得不张贴你的代码,所以我们可以看到你使用的是什么模式, dill (和pickle )失败。 我知道有一个模块导入另一个不“安装”(即在某些本地目录),并期望序列化“只是工作”不适用于所有情况。
看dill问题: https : //github.com/uqfoundation/dill/issues/128 https://github.com/uqfoundation/dill/issues/129和这个问题: 为什么莳萝转储外部类通过引用,不管是什么? 对于一些失败和潜在的解决方法的例子。
编辑关于更新的问题:
我看不到你的问题。 从命令行运行,从解释器import test_serialization ( import test_serialization ),并在解释器中运行脚本(如下所示,并在步骤3-5中指出)都可以工作。 那让我觉得你可能会使用老版本的dill ?
>>> import os >>> import make_persist_load >>> >>> MAKE_AND_PERSIST = False #True >>> LOAD = (not MAKE_AND_PERSIST) >>> >>> cwd = os.getcwd() >>> store_path = os.path.join(cwd,"test_stored_env.pkl") >>> >>> if MAKE_AND_PERSIST == True: ... make_persist_load.make_env_and_persist() ... >>> if LOAD == True: ... loaded_env = make_persist_load.load_env(store_path) ... >>>
编辑根据评论中的讨论:
看起来这可能是windows的一个问题,因为这似乎是唯一的 *** 作系统的错误出现。
一些工作后编辑 (见: https : //github.com/uqfoundation/dill/issues/140 ):
使用这个最小的例子,我可以在windows上重现相同的错误,而在MacOSX上它仍然可以工作…
# test.py class Environment(): def __init__(self): pass
和
# doit.py import test import dill env = test.Environment() path = "test.pkl" with open(path,'w+') as f: dill.dump(env,f) with open(path,'rb') as _f: _env = dill.load(_f) print _env
但是,如果使用open(path,'r') as _f ,则它可以在windows和MacOSX上运行。 所以看起来像windows上的__import__对文件类型比对非windows系统更敏感。 不过,抛出一个importError是很奇怪的…但是这个小小的改变应该可以起作用。
如果有人遇到同样的问题,我有同样的问题运行Python 2.7,问题是在windows上创建的pickle文件,而我正在运行的linux,我所要做的就是运行dos2unix必须先下载
sudo yum install dos2unix
然后你需要转换pickle文件的例子
dos2unix data.p
总结以上是内存溢出为你收集整理的`pickle`:又一个`ImportError:No module named my_module`全部内容,希望文章能够帮你解决`pickle`:又一个`ImportError:No module named my_module`所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)