2012-12-21 83 views
2

我有以下设置:在python2.7下运行的Pyro nameserver,在python2.7下运行的Pyro守护进程,以及(理想情况下)运行python3.3的Pyro客户端。Pyro4将python2连接到python3

如果我使用在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互连,是不是这种情况?

无论是2.7和Python 3.3例如使用Pyro4版本4.16

编辑:这里的,这不是为我工作的一些实际代码:

(随着python2纳秒开始)

在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()) 

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

+0

最后我说拧紧,移植项目回python2.7。但是,如果有人知道这个问题,我仍然很好奇这个问题的答案。 –

回答

1

原因是泡菜。它是用于通过网络交换对象的“协议”。 这就是为什么你不能传递类,而只能传递对象等等。 Pick3 for py3有重大变化,但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服务器并发送/接收序列化的字符串/命令。

P.S .:我看到的帖子是旧的!

1

cox说的是对的。 python2,3之间的泡菜是不同的。但是蛇似乎是兼容的。 您可以尝试

PYRO_SERIALIZERS_ACCEPTED =蛇的/ usr/bin中/ python3 -Wignore -m Pyro4.naming