首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ImportError:没有名为copy_reg pickle的模块

ImportError:没有名为copy_reg pickle的模块
EN

Stack Overflow用户
提问于 2009-02-17 10:42:59
回答 9查看 22.7K关注 0票数 22

我正在尝试解选在MySQL数据库中存储为blob的对象。我已经手动生成了pickled对象并将其存储在数据库中,但是当我尝试取消pickled对象时,我得到了以下相当神秘的异常:

ImportError:没有名为copy_reg的模块

你知道为什么会发生这种情况吗?

再现的方法

注意:必须在Windows PC上执行步骤1,在Linux PC上执行步骤3和4。

1)在Windows PC上:

代码语言:javascript
复制
file = open("test.txt", "w")
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)

2)在linux上运行的MySQL数据库的blob字段中手动插入text.txt的内容

3)在linux机器上运行的Python中,从MySQL获取列的内容

4)假设您将blob列的内容放入一个名为data的变量中,尝试如下所示:

代码语言:javascript
复制
cPickle.loads(rawString)
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-02-17 10:52:36

看起来这可能是由于我的导出酸洗对象的方法造成的。

This bug report建议我的问题可以通过导出到一个以二进制模式写入的文件来解决。我现在要试一试,看看这是否解决了我的问题。

更新:这是可行的。解决方案是确保将您的酸洗对象导出到以二进制模式打开的文件,即使您使用的是默认协议0(通常称为“文本”)也是如此。

基于有问题的原始示例的正确代码:

代码语言:javascript
复制
file = open("test.txt", 'wb')
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)
票数 24
EN

Stack Overflow用户

发布于 2009-04-17 13:50:02

此外,只需在(windows创建的) pickle文件上运行dos2unix (在linux下)就为我解决了这个问题。(我还没有尝试过开放模式'wb‘的东西。)丹

票数 16
EN

Stack Overflow用户

发布于 2009-08-07 14:42:46

这只是一个交互式的python会话,用来说明你不需要任何特定的代码就能解决这个问题:

在windows机器上做这样的事情

代码语言:javascript
复制
Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle, re
>>> empty_string = re.compile("^$")
>>> pickle.dump([empty_string,1,1.23,'abc'], file('m:/mario/test-b.dump','wb'))
>>> pickle.dump([empty_string,1,1.23,'abc'], file('m:/mario/test-t.dump','wt'))
>>> 

然后尝试从linux机器中检索数据

代码语言:javascript
复制
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> pickle.load(file('/home/mario/.gvfs/transfer on 192.168.0.4/mario/test-b.dump'))
/usr/lib/python2.6/pickle.py:1124: DeprecationWarning: The sre module is deprecated, please import re.
  __import__(module)
[<_sre.SRE_Pattern object at 0xb7d42420>, 1, 1.23, 'abc']
>>> pickle.load(file('/home/mario/.gvfs/transfer on 192.168.0.4/mario/test-t.dump'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/pickle.py", line 1370, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.6/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.6/pickle.py", line 1090, in load_global
    klass = self.find_class(module, name)
  File "/usr/lib/python2.6/pickle.py", line 1124, in find_class
    __import__(module)
ImportError: No module named sre
>>> 

如果你只是在酸洗基类型,那么这个错误消息可能会更加令人困惑。这是我使用list [12, 1.2, '']得到的结果

代码语言:javascript
复制
ValueError: insecure string pickle
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/556269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档