ピクルスで悩んでいます。OSX と Linux の間では問題なく動作しますが、Windows と Linux ではうまくいきません。pickle 化された文字列はすべてメモリに保存され、SSL ソケット経由で送信されます。100% 明確にするために、すべての '\n' を ":::" に、すべての '\r' を "===" に置き換えました (何もありませんでした)。シナリオ:
- Client-Win: Python 2.7 を実行する Small Business Server 2011
- Client-Lin: Python 2.7 を実行する Fedora Linux
- サーバー: Python 2.7 を実行する Fedora Linux
Client-Lin は pickled オブジェクトをサーバーに送信します。
ccopy_reg:::_reconstructor:::p0:::(c__main__:::infoCollection:::p1:::c__builtin__:::tuple:::p2:::(VSTRINGA:::p3:::VSTRINGB:::p4:::VSTRINGC:::p5:::tp6:::tp7:::Rp8:::.
Client-Win は、選択したオブジェクトをサーバーに送信します。
ccopy_reg:::_reconstructor:::p0:::(c__main__:::infoCollection:::p1:::c__builtin__:::tuple:::p2:::(VSTRINGA:::p3:::VSTRINGB:::p4:::VSTRINGC:::p5:::tp6:::tp7:::Rp8:::ccollections:::OrderedDict:::p9:::((lp10:::(lp11:::S'string_a':::p12:::ag3:::aa(lp13:::S'string_b':::p14:::ag4:::aa(lp15:::S'string_c':::p16:::ag5:::aatp17:::Rp18:::b.
何らかの理由で、Windows クライアントは pickle とともに追加情報を送信し、Linux クライアントが pickle 文字列を読み込もうとすると、次のようになります。
Unhandled exception in thread started by <function TestThread at 0x107de60>
Traceback (most recent call last):
File "./test.py", line 212, in TestThread
info = pickle.loads(p_string)
File "/usr/lib64/python2.7/pickle.py", line 1382, in loads
return Unpickler(file).load()
File "/usr/lib64/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib64/python2.7/pickle.py", line 1224, in load_build
d = inst.__dict__
AttributeError: 'infoCollection' object has no attribute '__dict__'
何か案は?
EDIT 追加の要求された情報を追加します。
infoCollection クラスは同じ方法で定義されます。
infoCollection = collections.namedtuple('infoCollection', 'string_a, string_b, string_c')
def runtest():
info = infoCollection('STRINGA', 'STRINGB', 'STRINGC')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_TLSv1)
ssl_sock.connect((server, serverport))
ssl_sock.write(pickle.dumps(info))
ssl_sock.close()
受信機能はほぼ同じですが、
p_string = ssl_sock.read()
info = pickle.loads(p_string)