22

MySQL データベースに BLOB として保存されているオブジェクトを unpickle しようとしています。pickle 化されたオブジェクトを手動で生成してデータベースに保存しましたが、オブジェクトを unpickle しようとすると、次の不可解な例外が発生します。

ImportError: 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) text.txt の内容を、Linux で実行されている MySQL データベースの blob フィールドに手動で挿入します。

3) Linux マシンで実行されている Python で、MySQL から列の内容をフェッチします。

4) blob 列の内容を data という変数に入れると仮定して、これを試してください。

cPickle.loads(rawString)
4

9 に答える 9

24

これは、ピクルされたオブジェクトをエクスポートする私の方法が原因である可能性があります。

このバグ レポートは、バイナリ モードで書き込んだファイルにエクスポートすることで問題を解決できることを示しています。これを試して、これで問題が解決するかどうかを確認します。

更新:これは機能します。解決策は、デフォルトのプロトコル 0 (一般に「テキスト」と呼ばれる) を使用している場合でも、pickled オブジェクトをバイナリ モードで開いているファイルにエクスポートすることです。

問題の元の例に基づいてコードを修正します。

file = open("test.txt", 'wb')
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)
于 2009-02-17T10:52:36.110 に答える
16

また、(Windowsで作成された)ピクルファイルに対してdos2unix(Linuxで)を実行するだけで問題が解決しました。(オープンモードの「wb」は試していません。)ダン

于 2009-04-17T13:50:01.900 に答える
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
于 2009-08-07T14:42:46.120 に答える
1

ここで起こっているもう 1 つのことは、pickle をファイルにダンプした後にファイルを閉じていないように見えることです。ここで報告されているエラーは、(Windows マシン上であるかどうかに関係なく) ファイルを閉じていないことが原因で発生することがあります。

于 2014-10-19T02:09:30.913 に答える
0

pickle ロードは、Python スクリプトと同じ場所を探していない可能性があります。アプリケーションに基づいてディレクトリが変更される場合があります。pickle をロードする直前に、os.getcwd() を出力して解決策を見つけてください。

于 2016-02-16T17:55:58.687 に答える