问题:如何从机器B执行机器A上的程序?
方案1:机器A是一台windows机器,从机器B远程登录执行。
方案2:机器A是一台linux服务器,远程shell登录执行。
方案3:使用XML-RPC 构造一个远程调用服务。
前提条件:python3环境
解决方案:
首先,我们实现调用一个方法。
1、实现一个远程函数,支持调用, 假如机器的IP为:192.168.1.14
#encoding:utf-8 #导入xmlrpc服务 from xmlrpc.server import SimpleXMLRPCServer #定义一个加法 def add(x,y): return x+y #声明一个rpc server, 端口号为:15000 remote_service = SimpleXMLRPCServer(('192.168.1.14', 15000)) #注册add方法到服务中 remote_service.register_function(add) #启动服务,开始监听 remote_service.serve_forever()
将代码保存到一个脚本中,命名为:simplerpc.py
在命令行中,执行:python simplerpc.py
2、声明一个调用脚本,调用远程机器A上的方法add。
from xmlrpc.client import ServerProxy s = ServerProxy('http://192.168.1.14:15000', allow_none=True) #调用方法,s.add(1, 2);获取1+2的值,为了从控制台看到结果,所以加额print print(s.add(1, 2))
将代码保存在机器B中,命名为:simplerpc-client.py
在命令行中,执行:python simplerpc-client.py
从控制台中,我们可以看到结果:3
其次,实现调用一个脚本。
机器A上有一个脚本test.py,假如存在目录:/user/download/下
#encoding: utf-8 print("test")
机器A上的代码中,添加一个方法。
#encoding:utf-8 from xmlrpc.server import SimpleXMLRPCServer import os def add(x,y): return x+y #通过os.popen方法,执行一个脚本 #执行后返回的是一个文件,通过read返回文件中的内容。 def runscript(scriptcmd): result = os.popen(scriptcmd); return result.read(); serv = SimpleXMLRPCServer(('192.168.1.14', 15000)) serv.register_function(add) #注册runscript方法 serv.register_function(runscript) serv.serve_forever()
在机器B中调用机器A中的脚本:
from xmlrpc.client import ServerProxy s = ServerProxy('http://192.168.1.14:15000', allow_none=True) print(s.add(1, 2)) print(s.runscript('python3 /user/download/test.py')
执行后,在控制台将会看到:test 字符串
XML-RPC的一个缺点是它的性能。SimpleXMLRPCServer 的实现是单线程的, 所以它不适合于大型程序。
优点,这种方式的编码可以被绝大部分其他编程语言支持。
通过使用这种方式,其他语言的客户端程序都能访问这个服务。
虽然XML-RPC有很多缺点,但是如果需要快速构建一个简单远程过程调用系统的话,它仍然值得去学习的。
有时候,简单的方案就已经足够了。