何かがdill
に存在します。のは、オブジェクトのリストを見てみましょう、と私たちは何ができるかを参照してください。
>>> import dill
>>> f = open('whatever', 'w')
>>> f.close()
>>>
>>> l = [iter([1,2,3]), xrange(5), open('whatever', 'r'), lambda x:x]
>>> dill.detect.trace(False)
>>> dill.pickles(l)
False
[OK]を、dill
リストをpickle化に失敗しました。だから問題は何ですか?
>>> dill.detect.trace(True)
>>> dill.pickles(l)
T4: <type 'listiterator'>
False
いいえ、リストの最初の項目はピクルに失敗します。残りはどう?
>>> map(dill.pickles, l)
T4: <type 'listiterator'>
Si: xrange(5)
F2: <function _eval_repr at 0x106991cf8>
Fi: <open file 'whatever', mode 'r' at 0x10699c810>
F2: <function _create_filehandle at 0x106991848>
B2: <built-in function open>
F1: <function <lambda> at 0x1069f6848>
F2: <function _create_function at 0x1069916e0>
Co: <code object <lambda> at 0x105a0acb0, file "<stdin>", line 1>
F2: <function _unmarshal at 0x106991578>
D1: <dict object at 0x10591d168>
D2: <dict object at 0x1069b1050>
[False, True, True, True]
hm。他のオブジェクトはうまくいきます。だから、最初のオブジェクトを置き換えましょう。
>>> dill.detect.trace(False)
>>> l[0] = xrange(1,4)
>>> dill.pickles(l)
True
>>> _l = dill.loads(dill.dumps(l))
ここではオブジェクトピクルです。さて、linux/unix/macでのpicklingで起こる組み込みのオブジェクト共有を利用することができます...実際にサブプロセスを横切るような強いチェックはどうでしょうか?
>>> dill.check(l)
[xrange(1, 4), xrange(5), <open file 'whatever', mode 'r' at 0x107998810>, <function <lambda> at 0x1079ec410>]
>>>
いいえ、リストはまだ動作しません...これは他のプロセスに正常に送信できるオブジェクトです。
は今、誰もが無視するように見えたあなたのエラーについて、で...
ModuleType
オブジェクトがpickleableないが、それはあなたのエラーを引き起こしています。
>>> import types
>>> types.ModuleType
<type 'module'>
>>>
>>> import pickle
>>> pickle.dumps(types.ModuleType)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
Pickler(file, protocol).dump(obj)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
self.save(obj)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 748, in save_global
(obj, module, name))
pickle.PicklingError: Can't pickle <type 'module'>: it's not found as __builtin__.module
dill
をインポートすると、魔法のように動作します。
>>> import dill
>>> pickle.dumps(types.ModuleType)
"cdill.dill\n_load_type\np0\n(S'ModuleType'\np1\ntp2\nRp3\n."
>>>
いいえ、私はこれが私の答えよりも好きです。なぜなら、それは複数のレベルの深さであっても問題のあるオブジェクトを識別するためです。あなたの大量のオブジェクト内の**すべての** unpicklableオブジェクトを見つけるには、これを 'try' ...' except'ブロックで囲みます。 – RoundTower
ありがとう!私はcPickleで始まったので、Picklerオブジェクトは忘れてしまった。私はすぐにこれを試してみるが、これは私が探しているもののように見える – jmite
魅力のように動作します!それは私が手で見なければならないコード行が2500行少なくなります... – jmite