2016-10-25 9 views
0

だから、文字列をうまく送信できます。私がやりたいことは、多かれ少なかれリストの文字列表現を送ることです。私は、リストを文字列として送信できるように変換してから変換する必要があることをよく知っています。ソケットを介してデータを送信した後、リストに戻されません

#on sending 
l = [1,2,3,4] 
l_str = str(l) 

#on receiving 
l = ast.literal_eval(received_data) 

## or pickle 
l = pickle.dumps([1,2,3,4]) 

##then 
l = pick.loads(received_data) 

私の問題は、受信と送信の間に何か奇妙なことが起こっているようです。

は、今私が持っているこの

msg = pickle.dumps([sys.stdin.readline(), person]) 
s.send(msg) 
sys.stdin.readlineは、()コンソールと人に入力されたラインで誰かの名前を含む変数である

私はそうそうです。

d1 = sock.recv(4096) 
pickles = False     
try: 
    d1 = pickle.loads(d1) 
    pickles = True 

私はちょうど私の最初の方法でリスト文字列を作成し、その後ast.literal_eval使用するか、または漬物を使用する場合、それは問題ではありませんが、それは決して実際に戻って欲しいリストに変換します。

私は現在、pickleを使って投げ捨てられた何かを戻していない時間があることを知っているので、try文を用意しています。まるで受信したデータが正しくフォーマットされたかのように続きます。

漬物が......任意のアイデア真なることはありませんので、私は、インスタンスのためにそれらをunpickle化しようとしたときに生成されるエラーは成功することはありません

Traceback (most recent call last): 
    File "telnet.py", line 75, in <module> 
    d1 = pickle.loads(d1) 
    File "/usr/local/lib/python2.7/pickle.py", line 1382, in loads 
    return Unpickler(file).load() 
    File "/usr/local/lib/python2.7/pickle.py", line 858, in load 
    dispatch[key](self) 
KeyError: '\r' 

pickle.loadsされますか?

編集:私は全体的な解決策を持っています。私の問題は実際にはエラーで見られるファイルではなく、telnet.pyだが別のファイルにある。私は中間サーバーが入力を受け取っていて、それを変更していることに気付かなかった。しかし、いくつかの提案の後、私はそれがまさに何が起こっていたのか分かった。

+0

ソケットで文字列を送信しているので、送信側では 'print msg'を、受信側では' print d1 'を受信して​​確認してください。それらが同じかどうかを確認してください。それらが同じであれば、ソケットなしで問題を再現することができ、より簡単な質問になります。それらが異なる場合は、リストとピクルスなしで問題を再現することができ、これは再び簡単な質問になります。 – zvone

+0

2番目の考えでは、 'print repr(msg)'と 'print repr(d1)' – zvone

+0

私はそれを行っています、私は彼らが同じではないことを私にかなり明確に意味するが、私はその質問が理由だと思う。 –

答えて

0

実際に別のファイルから問題が発生しました。当時私はこれがチャットサーバー/クライアントであることが重要であることを認識していませんでした。しかし、チャットサーバーは、実際にデータをクライアントに送り返していました。正直なところ、私はそれがどうやって私に当たったのか分かりませんが、何が起こったのか分かりません。

関連する問題