1

我正在寻找一种可能性来做这样的事情:

import paramiko, Pyro4

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('machine1', username='user1')

stdin,stdout,stderr = ssh.exec_command("python server.py")
uri = stdout.readlines()[-1]
ssh.close()
worker = Pyro4.Proxy(uri)
worker.do_some_stuff()


# server.py
import Pyro4

class Worker(object):
    def do_some_stuff(): 
         ....


worker = Worker()

daemon=Pyro4.Daemon()                
uri=daemon.register(worker) 
daemon.requestLoop()  
print uri

所以我想登录一台机器,启动一个 PyroServer / Daemon 并通过 ssh 返回 uri。在这一步之后,我想在远程对象上执行一个函数。不幸的是,如果我启动一个 Pyroserver,它不会在后台运行,所以我不会从 stdout 获得任何返回值。最好的方法是什么?我对 pyro 库很陌生,所以也许有一些更优雅的方法,谢谢。

4

2 回答 2

0

在调用 requestLoop()之前打印守护进程的 uri 。后者,顾名思义,进入一个循环。除非收到中断信号,否则它通常不会从中返回。

于 2015-02-19T19:43:57.453 回答
0

我建议运行一个名称服务器并使用名称服务器注册一个预定义的 uri,这不会让您等待 uri,如下所示:

起始名称服务器:

python -m Pyro4.naming -n machine1_ip

现在在 server.py 中,包括以下几行:

daemon=Pyro4.Daemon(machine1_ip)
worker=Worker()
uri=daemon.register(worker)
ns.register("worker_uri", uri)

现在您可以使用“worker_uri”uri 访问:

test=Pyro4.Proxy("PYRONAME:worker_uri")
test.do_some_stuff()

希望这可以帮助。

于 2015-06-30T07:54:10.610 回答