Pyro4将python2连接到python3

时间:2012-12-21 01:24:06

标签: python-3.x python-2.7 pyro

我有以下设置:在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'       

尝试使用任何远程方法时。 pyro文档似乎暗示我应该能够将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.3 virtualenv中:

import Pyro4

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

我得到了上面提到的确切例外。

2 个答案:

答案 0 :(得分:1)

原因是泡菜。它是用于通过网络交换对象的“协议”。 这就是为什么你不能传递类,而只是传递对象等等。 py3的pickle有重大变化,但2.7 vs. 2.6没有。因此,理论上,pyro将在2.6&gt;之间工作。 2.7,但不是2.7&gt; 3.3。 (它的工作原理,我有一个带有python 2.6的VPS,我也强迫在py2.7上移动我的comp上的客户端应用程序。)可能一个hale pickle模块可能会避免错误,但我相信会打开一个潘多拉盒子。唯一的“真正”替代方案是使用python服务器,通过http / socket / https(不一定是Web服务器)和发送/接收序列化字符串/命令。

P.S。:我看到帖子已经老了!

答案 1 :(得分:1)

考克斯说的是对的。 pickle在python2,3之间是不同的。但蛇似乎是兼容的。 你可以尝试

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