importorror:没有名为copy_reg pi的模块

2024-04-26 01:06:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试取消对MySQL数据库中存储为blob的对象的锁定。我已经手动生成了pickle对象并将其存储在数据库中,但是当我尝试取消对该对象的pickle时,会出现以下相当神秘的异常:

importorror:没有名为copy_reg的模块

你知道为什么会这样吗?

复制方法

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

1)在Windows PC上:

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的变量中,请尝试以下操作:

cPickle.loads(rawString)

Tags: 对象txt数据库内容linuxwindowsmysql步骤
3条回答

只是一个交互式的python会话,以显示不需要任何特定的代码就可以出现此问题:

在windows机器上做这样的事情

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系统中检索数据

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
>>> 

如果只是选取基类型,则错误消息可能会更加混乱。这就是我得到的列表[12, 1.2, '']

ValueError: insecure string pickle

这似乎是由我导出pickled对象的方法引起的。

This bug report请参阅,建议通过导出到以二进制模式写入的文件来解决我的问题。我现在要试一试,看看这能不能解决我的问题。

更新:这有效。解决方案是确保将pickled对象导出到以二进制模式打开的文件中,即使使用默认协议0(通常称为“文本”)

基于所讨论的原始示例的正确代码:

file = open("test.txt", 'wb')
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)

另外,简单地在(windows创建的)pickle文件上运行dos2unix(在linux下)就解决了这个问题。(没有尝试过开放模式“wb”的东西。) 丹

相关问题 更多 >