我有以下设置:在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())
我得到了上面提到的确切例外。
答案 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