アドバイスをお願いします。Python2.6で次のエラーが発生しました。
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では、すべてが夢のように実行されますが、Python3ではDjangoを使用できないため、コードをバックデートする必要があります。これが問題の原因です。
私のコード(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()
ご覧のとおり、これは非常に単純ですが、クライアントからサーバーにユニコード文字列を解析すると、「辞書キーは文字列である必要があります」というメッセージが表示されます。ただし、サーバーは非常に満足しているようで、次のフィードバックを生成します。これは、サーバーがピクルス辞書にアクセスしたことを示しています(ドキュメント番号とngramのカウントを返します)。
{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 -
私が行う場合:type(query)結果は次のとおりです。
reload(sys)
また、接頭辞u'unicode_string'
、、、u"".join(unicode_string)
および.decode('utf-8') `を試しましquery
たが、それでもこのエラーが発生するか、Unicode/ASCIIデコードに関連するエラーが増えます。
このエラーを回避する方法を誰かが知っていますか?または、Python 2.6でサーバーインスタンスとクライアント間でデータを提供するためのXMLPRPCServerの代替手段はありますか?
よろしくお願いします。