2011-08-09 20 views
2

私はいくつかのアドバイスをしたいと思います。私はPython 2.6で次のエラーが発生しました:xmlrpclib:辞書キーは文字列型エラーである必要があります

Traceback (most recent call last): 
    File "<pyshell#20>", line 1, in <module> 
    s.Search(query) 
    File "/usr/lib/python2.6/xmlrpclib.py", line 1199, in __call__ 
    return self.__send(self.__name, args) 
    File "/usr/lib/python2.6/xmlrpclib.py", line 1489, in __request 
    verbose=self.__verbose 
    File "/usr/lib/python2.6/xmlrpclib.py", line 1253, in request 
    return self._parse_response(h.getfile(), sock) 
    File "/usr/lib/python2.6/xmlrpclib.py", line 1392, in _parse_response 
    return u.close() 
    File "/usr/lib/python2.6/xmlrpclib.py", line 838, in close 
    raise Fault(**self._stack[0]) 
    Fault: <Fault 1: "<type 'exceptions.TypeError'>:dictionary key must be string"> 

私のコードは、Djangoを使用してミニ検索エンジンの一部を提供しています。 Python 3ではすべてが夢のように動作しますが、DjangoはPython 3では使用できませんので、問題の原因となるコードをバックデイトする必要があります。

私のコード(client.py):

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals # This was suggested elsewhere 
import xmlrpclib 

s = xmlrpclib.ServerProxy('http://localhost:11210') 
data = s.Search('מלאכא') # tried prefixing with 'u' 
print data 

私のコード(Server.py):

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
import pickle, sys, xmlrpclib 
from SimpleXMLRPCServer import SimpleXMLRPCServer 
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler 
from collections import defaultdict 

docscores = pickle.load(open("docscores.pkl", "rb")) 
print ("Everything loaded. No errors.") 

# Restrict to a particular path. 
class RequestHandler(SimpleXMLRPCRequestHandler): 
    rpc_paths = ('/RPC2',) 

# Create server 
server = SimpleXMLRPCServer(("localhost", 11210), requestHandler=RequestHandler) 

server.register_introspection_functions() 

def Search(query): 
    results = docscores[query] 
    return results 

server.register_function(Search, 'Search') 

# Run the server's main loop 
server.serve_forever() 

あなたはそれが非常に簡単だが、私は「辞書のキー必見を得る見ることができるようにユニコード文字列をクライアントからサーバーに渡って解析するときには 'be string'と指定します。ただし、サーバーは非常に満足しているようだし、それは私の漬物の辞書(nグラムのドキュメントの数と数を返す)アクセスした示し、次のフィードバック、生産:私がすれば

{160: 3, 417: 1, 35: 1, 133: 1, 376: 1, 193: 1, 380: 1, 363: 1, 364: 1, 126: 1, 47: 1, 145: 1, 147: 1, 382: 1, 246: 3, 121: 4, 440: 1, 441: 1, 444: 1, 280: 1} 
localhost.localdomain - - [09/Aug/2011 13:32:23] "POST /RPC2 HTTP/1.0" 200 - 

を: タイプ(クエリ) を結果は次のとおりです。

私はまたu'unicode_string'u"".join(unicode_string)、およびquery .decode(「UTF-8」) `接頭辞、reload(sys)を試してみましたが、それでもこのエラーを取得、またはUnicodeに関連する複数のエラーで終わるしました/ ASCIIデコード。

誰も私がこのエラーを回避する方法はありますか?または、Python 2.6でサーバーインスタンスとクライアント間でデータを処理するためのXMLPRPCServerに代わる方法がありますか?

事前に感謝します。

答えて

4

XMLを通じてマーシャリングするPythonの辞書のためのキーは文字列でなければならないことxmlrpclib状態のドキュメント:

A Pythonの辞書。キーは文字列でなければならず、値は任意の 準拠型です。ユーザー定義のクラスのオブジェクトを渡すことができます。 のみdict属性が送信されます。

だから、キーとして文字列で辞書を返すために、サーバーの検索方法を変更する必要があります。

def Search(query): 
    results = docscores[query] 
    # I believe results is now a dictionary in the form {<integer>: <integer>} 
    return dict((str(key), value) for key, value in results.items()) 
+0

は、問題を解決している、@mouadありがとう、私は、サーバーの間違った側からそれに近づきました。 。非常に迅速な対応もありがとう! :-) – Martyn

+0

@Martyn:それは助けになってうれしい: - – mouad

関連する問題