2

次の設定があります:python2.7で実行されているPyroネームサーバー、python2.7で実行されているPyroデーモン、および(理想的には)python3.3を実行しているPyroクライアント。

python2.7で実行されているクライアントを使用してサーバーに接続すると、すべてが正常に機能します。クライアントにpython3.3を使用すると、プロキシ接続を問題なく作成できますが、次のようになります。

Traceback (most recent call last):                                                                                                                     
  File "<stdin>", line 1, in <module>                                                                                                                  
  File "/project_path/lib/python3.3/site-packages/Pyro4/core.py", line 149, 
    return self.__send(self.__name, args, kwargs)                                                                                                      
  File "/project_path/lib/python3.3/site-packages/Pyro4/core.py", line 271, 
    self.__pyroCreateConnection()                                                                                                                      
  File "/project_path/lib/python3.3/site-packages/Pyro4/core.py", line 322, 
    uri=resolve(self._pyroUri)                                                                                                                         
  File "/project_path/lib/python3.3/site-packages/Pyro4/naming.py", line 336
    nameserver=locateNS(uri.host, uri.port)                                                                                                            
  File "/project_path/lib/python3.3/site-packages/Pyro4/naming.py", line 274
    proxy.ping()                                                                                                                                       
  File "/project_path/lib/python3.3/site-packages/Pyro4/core.py", line 149, 
    return self.__send(self.__name, args, kwargs)                                                                                                      
  File "/project_path/lib/python3.3/site-packages/Pyro4/core.py", line 290, 
    data=self._pyroSerializer.deserialize(data, compressed=flags & MessageFactory.FLAGS_COMPRESSED)                    
  File "/project_path/lib/python3.3/site-packages/Pyro4/util.py", line 146, 
    return self.pickle.loads(data)                                                                                                                     
ImportError: No module named 'exceptions'       

リモートメソッドを使用しようとするとき。パイロドキュメントは、python2.7インスタンスをpython3.3と相互接続できるはずだと示唆しているようですが、そうではありませんか?

Pythonの2.7インスタンスと3.3インスタンスの両方がPyro4バージョン4.16を使用しています

編集:これが私のために機能していないいくつかの実際のコードです:

(python2 nsで開始)

python2.7 virtualenvの場合:

import Pyro4

class TestProxy(object):       

    def foo(self):             
        return "bar"           

if __name__ == "__main__":     

    print "* Starting test proxy"   
    daemon=Pyro4.Daemon()
    tproxy_uri=daemon.register(TestProxy())
    ns=Pyro4.locateNS()
    ns.register("foo",tproxy_uri)   

    print "* Proxy started"
    daemon.requestLoop()

およびpython3.3virtualenvの場合:

import Pyro4

rtest = Pyro4.Proxy("PYRONAME:foo")
print(rtest.foo())

上記の正確な例外が発生します。

4

2 に答える 2

1

コックスの言うことは正しい。ピクルスはpython2,3で違います。でも蛇は相性良さそう。あなたが試すことができます

PYRO_SERIALIZERS_ACCEPTED=serpent /usr/bin/python3 -Wignore -m Pyro4.naming

于 2014-05-15T14:00:25.280 に答える
1

その理由は漬物です。これは、ネットワーク上でオブジェクトを交換するために使用される「プロトコル」です。そのため、クラスを渡すことはできず、オブジェクトなどのみを渡すことができます。py3 の Pickle には大きな変更がありますが、2.7 対 2.6 にはありません。したがって、理論的には、Pyro は 2.6 > 2.7 の間で機能しますが、2.7 > 3.3 では機能しません。(動作します。Python 2.6 の VPS があり、クライアント アプリを py2.7 のコンプに移動する必要があります。) おそらく pickle モジュールのハックでエラーを回避できるかもしれませんが、パンドラ ボックスが開くと確信しています。 . 唯一の「本当の」代替手段は、http/socket/https (必ずしも Web サーバーではない) 経由で Python サーバーを使用し、シリアル化された文字列/コマンドを送受信することです。

PS: 投稿が古いことがわかりました。

于 2013-04-14T19:22:48.347 に答える