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'       

尝试使用任何远程方法时。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())

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

4

2 回答 2

1

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

PS:我看到帖子很旧!

于 2013-04-14T19:22:48.347 回答
1

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

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

于 2014-05-15T14:00:25.280 回答