请问如何用java远程调用python? 谢谢!
本帖最后由 blackkettle 于 2015-05-07 13:00:41 编辑
比如有一台机器 A上安装了python, 另一台机器B要用java 调用A 上的python的某个函数,输入数据在B机器上,所有的计算在A机器完成,结果返回给B机器。
请问这个怎么实现?
希望大侠能给一个简单的demo, 非常感谢!
------解决思路----------------------
在A机器上搭建一个服务,可以采用socket、webservice、httppost等方式提供服务,在服务中接收到请求后调用python,并将结果返回
在B机器上开发一个终端调用A机器上的服务即可。
------解决思路----------------------
我也是新人
不过远程的话,可以用服务器+同步\异步交互,建议是Apache+JSON
------解决思路----------------------
socket: 直接用socket. 自己定义协议: 函数名, 参数值会怎么传递, 返回值要怎么传递等.
http: 用http协议, 函数名, 参数值等可以用GET/POST的参数传递. 但你要自己把复杂些的值(字典, 列表等)序列化(pickle, json等)
python有很多web framework, 也可以用自带的httpserver
rpc: 把上面的东西都包装起来, 用起来很像直接的函数调用.
文档(https://docs.python.org/2/library/xmlrpclib.html), 里面有例子, 也可以自己搜python+模块名.
例子, 服务器端:
import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer
def is_even(n):
return n%2 == 0
server = SimpleXMLRPCServer(("localhost", 8000))
print "Listening on port 8000..."
server.register_function(is_even, "is_even")
server.serve_forever()
客户端代码: (但你得换成java的版本, 搜java+rpc)
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
print "3 is even: %s" % str(proxy.is_even(3))
print "100 is even: %s" % str(proxy.is_even(100))
------解决思路----------------------
客户端没法强迫服务器端做什么(恶意入侵除外), 所以必须server主动提供一些函数, client才能调用.
server提供的函数不一定要是自己实现的, 也可以是从其他模块import来的. 参见下面的例子(sqrt, date.today).
下面的例子里还包括了一种情况, 需要传输的值(这儿是date object)rpc模块不知道怎么序列化, 这时需要你自己把它转变成能序列化的类型, 在另一端再转回来.
服务器:
# encoding: utf-8
import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer
from datetime import date
from math import sqrt
def is_even(n):
return n%2 == 0
server = SimpleXMLRPCServer(("localhost", 8000))
print "Listening on port 8000..."
server.register_function(is_even, "is_even")
server.register_function(sqrt, 'kaipingfang')
# next one will not work since xmlrpclib don't know how to marshal date object
server.register_function(date.today, 'today')
def today_in_string():
return str(date.today())
server.register_function(today_in_string, 'mytoday')
server.serve_forever()
客户端:
# encoding: utf-8
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
print "3 is even: %s" % str(proxy.is_even(3))
print "100 is even: %s" % str(proxy.is_even(100))
print "sqrt of 10: %s" % str(proxy.kaipingfang(10))
try: # the bad function
print "today is: %s" % str(proxy.today())
except Exception as e:
print e
print "today in string is: %s" % proxy.mytoday()