java与python交互,如何将java程序的数据传递至python
java与python交互,如何将java程序的数据传递至python详细介绍
本文目录一览: java接受python返回回来的数据,并且展示在前端?
可以使用 Java 的 Socket 编程实现前后端之间的数据交互。具体来说,可以在 Java 后端中创建一个服务器程序,在 Python 脚本中使用 Socket 将数据发送到该服务器。
以下是一个简单的示例,演示了如何使用 Socket 在 Python 和 Java 之间传递数据:
Python 脚本:
```python
import socket
# 创建 Socket 对象
s = socket.socket()
# 连接服务器
host = 'localhost' # 服务器的主机名或 IP 地址
port = 12345 # 服务器使用的端口号
s.connect((host, port))
# 发送数据到服务器
data = 'Hello, Java!'
s.sendall(data.encode())
# 接收服务器返回的数据
recv_data = s.recv(1024).decode()
print('Received data:', recv_data)
# 关闭连接
s.close()
```
Java 后端:
```java
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args) throws Exception {
// 创建服务器 Socket 对象并绑定端口
int port = 12345; // 服务器使用的端口号
ServerSocket server = new ServerSocket(port);
System.out.println("Server started");
// 等待客户端连接
Socket client = server.accept();
System.out.println("Client connected");
// 读取客户端发送的数据
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String data = in.readLine();
System.out.println("Received data: " + data);
// 准备要发送给客户端的数据
String response = "Hello, Python!";
// 向客户端发送数据
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
out.println(response);
// 关闭连接
in.close();
out.close();
client.close();
server.close();
}
}
```
在这个示例中,Python 脚本通过 Socket 连接到 Java 后端,并将字符串 `'Hello, Java!'` 发送给服务器。Java 后端接收到数据后,将其输出到控制台上,并向客户端(即 Python 脚本)发送字符串 `'Hello, Python!'`。Python 脚本再将收到的字符串输出到控制台上。
需要注意的是,以上示例中的代码只是一个简单的框架,需要根据具体需求进行修改和优化。同时,为避免出现字符集不一致等问题,建议在发送和接收数据时都指定明确的字符编码方式,例如 UTF-8。
java后端如何调python接口
最近在做项目的时候,需要java 调用 python 接口,在网上找了一些方法,但是总碰到一些问题,索性将网上的方法和自己的理解总结一下,希望对各位有所帮助,也请各位大神不吝赐教。此方法需要引用 org.python包,需要下载Jpython。在这里先介绍一下Jpython。下面引入百科的解释:(推荐学习:Python视频教程)Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。一:创建环境 Python 环境import org.python.util.PythonInterpreter;import java.util.Properties;/** * Jython环境,获取Python的实例 * @author webim * */public class JythonEnvironment { //定义一个静态变量 private static JythonEnvironment INSTANCE = new JythonEnvironment(); /** * 私有构造方法 */ private JythonEnvironment() { } /** * 获取单例 * @return JythonEnvironment */ public static JythonEnvironment getInstance() { return INSTANCE; } /** * 获取python解释器 * @return PythonInterpreter */ public PythonInterpreter getPythonInterpreter() { Properties props = new Properties(); props.put("python.home","path to the Lib folder"); props.put("python.console.encoding", "UTF-8"); // Used to prevent: console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0. props.put("python.security.respectJavaAccessibility", "false"); //don't respect java accessibility, so that we can access protected members on subclasses props.put("python.import.site","false"); Properties preprops = System.getProperties(); //对 python 进行初始化 PythonInterpreter.initialize(preprops, props, new String[0]); PythonInterpreter inter = new PythonInterpreter(); return inter; }}二:调用 python 的接口因为 python 和 java是两种不同的语言,因此在项目的 controller 、service 和 mapper 中直接出现 Python 的接口,因此自己封装ExecPython 类,封装python的接口,目的让 python 接口和java程序分隔开。import org.python.core.PyFunction;import org.python.core.PyObject;import org.python.util.PythonInterpreter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;import java.util.Map;/*enum的这个用法,可以作为变种的安全单例,值得借鉴哦 ^_^ */@Service@Componentpublic class ExecPython { public static final Logger logger = LoggerFactory.getLogger(Exception.class); //定义 python 解释器 private static PythonInterpreter inter; public ExecPython() { this.inter = JythonEnvironment.getInstance().getPythonInterpreter(); this.inter.execfile("C:\test.py"); } //设置 python 脚本的路径 public void setPythonPath (String pythonPath){ this.inter.execfile(pythonPath); } public void execute(String scriptFile, Map
properties) { logger.info("获取解释器"); try { PyFunction getNetInfo = (PyFunction) inter.get("getNetInfo", PyFunction.class); PyObject netInfo = getNetInfo.__call__(); System.out.println("anwser = " + netInfo.toString()); } catch (Exception e) { e.printStackTrace(); logger.info("Python 脚本文件执行失败"); } } //获取 Python 字符串 public String getString(){//获取到python 脚本中的接口 PyFunction func = (PyFunction) inter.get("adder", PyFunction.class); PyObject pyobj = func.__call__(); System.out.println("anwser = " + pyobj.toString()); return pyobj.toString(); } // 获取当前数组 public String getArr() { PyFunction getArr = (PyFunction) inter.get("getArr", PyFunction.class); PyObject pyobjTwo = getArr.__call__(); pyobjTwo.__len__(); System.out.println("anwser = " + pyobjTwo.toString()+" len:"+pyobjTwo.__len__()); //将 PyObject 对象转换成 java 对象 //Object object = pyobjTwo.__tojava__(List.class); //List
list = (List
) object; //将查询到数据转换成一个 JSON 字符串 String result = pyobjTwo.toString(); String JsonStr = "{" + result + "}"; logger.info(JsonStr); logger.info("将查询的结果转换成 JSON 字符串:",JsonStr); return pyobjTwo.toString(); }}更多Python相关技术文章,请访问Python教程栏目进行学习!
java调python
很多朋友都想知道java怎么调python?下面就一起来了解一下吧~
java调python主要有两种方法:1.使用Runtime.getRuntime()执行脚本文件;2. 将python脚本写成进程为java提供服务,下面是具体的方法介绍:
第一种:使用Runtime.getRuntime()执行脚本文件
先建立python脚本文件 demo.py
import?numpy?as?np a?=?np.arange(12).reshape(3,4)print(a)
java调用python程序并输出该结果
import?java.io.BufferedReader;import?java.io.IOException;import?java.io.InputStreamReader;public?class?Demo?{ ????public?static?void?main(String[]?args)?{ ????????//?TODO?Auto-generated?method?stub ????????Process?proc; ????????try?{ ????????????proc?=?Runtime.getRuntime().exec("python?D:\\demo.py");//?执行py文件 ????????????//用输入输出流来截取结果 ????????????BufferedReader?in?=?new?BufferedReader(new?InputStreamReader(proc.getInputStream())); ????????????String?line?=?null; ????????????while?((line?=?in.readLine())?!=?null)?{ ????????????????System.out.println(line); ????????????} ????????????in.close(); ????????????proc.waitFor(); ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????}?catch?(InterruptedException?e)?{ ????????????e.printStackTrace(); ????????}? ????}}
如若向python程序中函数传递参数并执行出结果,下面就举一例来说明一下。
同样建立python脚本文件demo2.py
import?sys def?func(a,b): ????return?(a+b)if?__name__?==?'__main__': ????a?=?[] ????for?i?in?range(1,?len(sys.argv)): ????????a.append((int(sys.argv[i]))) ????print(func(a[0],a[1]))
其中sys.argv用于获取参数url1,url2等。而sys.argv[0]代表python程序名,所以列表从1开始读取参数。
以上代码实现一个两个数做加法的程序,下面看看在java中怎么传递函数参数,代码如下:
int?a?=?18;int?b?=?23;try?{ ????String[]?args?=?new?String[]?{?"python",?"D:\\demo2.py",?String.valueOf(a),?String.valueOf(b)?}; ????Process?proc?=?Runtime.getRuntime().exec(args);//?执行py文件 ????BufferedReader?in?=?new?BufferedReader(new?InputStreamReader(proc.getInputStream())); ????String?line?=?null; ????while?((line?=?in.readLine())?!=?null)?{ ????????System.out.println(line); ????} ????in.close(); ????proc.waitFor();}?catch?(IOException?e)?{ ????e.printStackTrace();}?catch?(InterruptedException?e)?{ ????e.printStackTrace();}
其中args是String[] { “python”,path,url1,url2 }; ,path是python程序所在的路径,url1是参数1,url2是参数2,以此类推。
2. 将python脚本写成进程为java提供服务
python脚本文件如下:
import?socketimport?sysimport?threadingimport?numpy?as?npfrom?PIL?import?Imagedef?main(): ????#?创建服务器套接字 ????serversocket?=?socket.socket(socket.AF_INET,socket.SOCK_STREAM) ????#?获取本地主机名称 ????host?=?socket.gethostname() ????#?设置一个端口 ????port?=?12345 ????#?将套接字与本地主机和端口绑定 ????serversocket.bind((host,port)) ????#?设置监听最大连接数 ????serversocket.listen(5) ????#?获取本地服务器的连接信息 ????myaddr?=?serversocket.getsockname() ????print("服务器地址:%s"%str(myaddr)) ????#?循环等待接受客户端信息 ????while?True: ????????#?获取一个客户端连接 ????????clientsocket,addr?=?serversocket.accept() ????????print("连接地址:%s"?%?str(addr)) ????????try: ????????????t?=?ServerThreading(clientsocket)#为每一个请求开启一个处理线程 ????????????t.start() ????????????pass ????????except?Exception?as?identifier: ????????????print(identifier) ????????????pass ????????pass ????serversocket.close() ????passclass?ServerThreading(threading.Thread): ????#?words?=?text2vec.load_lexicon() ????def?__init__(self,clientsocket,recvsize=1024*1024,encoding="utf-8"): ????????threading.Thread.__init__(self) ????????self._socket?=?clientsocket ????????self._recvsize?=?recvsize ????????self._encoding?=?encoding????????pass ????def?run(self): ????????print("开启线程.....") ????????try: ????????????#接受数据 ????????????msg?=?'' ????????????while?True: ????????????????#?读取recvsize个字节 ????????????????rec?=?self._socket.recv(self._recvsize) ????????????????#?解码 ????????????????msg?+=?rec.decode(self._encoding) ????????????????#?文本接受是否完毕,因为python?socket不能自己判断接收数据是否完毕, ????????????????#?所以需要自定义协议标志数据接受完毕 ????????????????if?msg.strip().endswith('over'): ????????????????????msg=msg[:-4] ????????????????????break ??????????? ????????????sendmsg?=?Image.open(msg) ????????????#?发送数据 ????????????self._socket.send(("%s"%sendmsg).encode(self._encoding)) ????????????pass ????????except?Exception?as?identifier: ????????????self._socket.send("500".encode(self._encoding)) ????????????print(identifier) ????????????pass ????????finally: ????????????self._socket.close()? ????????print("任务结束.....") ???????? ????????pass ????def?__del__(self): ????????passif?__name__?==?"__main__": ????main()
在java代码中访问python进程的代码: package?hello;import?java.lang.System;import?java.io.BufferedReader;import?java.io.IOException;import?java.io.InputStreamReader;import?java.net.InetAddress;import?java.net.Socket;import?java.io.OutputStream;import?java.io.PrintStream;import?java.io.InputStream;public?class?hello?{ ????public?static?void?main(String[]?args){ ????????//System.out.println("Hello?World!"); ????????//?TODO?Auto-generated?method?stub ????????try?{ ????????????InetAddress?addr?=?InetAddress.getLocalHost(); ????????????String?host=addr.getHostName(); ????????????//String?ip=addr.getHostAddress().toString();?//获取本机ip ????????????//log.info("调用远程接口:host=>"+ip+",port=>"+12345); ????????????//?初始化套接字,设置访问服务的主机和进程端口号,HOST是访问python进程的主机名称,可以是IP地址或者域名,PORT是python进程绑定的端口号 ????????????Socket?socket?=?new?Socket(host,12345); ????????????//?获取输出流对象 ????????????OutputStream?os?=?socket.getOutputStream(); ????????????PrintStream?out?=?new?PrintStream(os); ????????????//?发送内容 ????????????out.print(?"F:\\xxx\\0000.jpg"); ????????????//?告诉服务进程,内容发送完毕,可以开始处理 ????????????out.print("over"); ????????????//?获取服务进程的输入流 ????????????InputStream?is?=?socket.getInputStream(); ????????????BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(is,"utf-8")); ????????????String?tmp?=?null; ????????????StringBuilder?sb?=?new?StringBuilder(); ????????????//?读取内容 ????????????while((tmp=br.readLine())!=null) ????????????????sb.append(tmp).append('\n'); ????????????System.out.print(sb); ????????????//?解析结果 ????????????//JSONArray?res?=?JSON.parseArray(sb.toString()); ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????}finally?{ ????????????try?{if(socket!=null)?socket.close();}?catch?(IOException?e)?{} ????????????System.out.print("远程接口调用结束."); ????????} ??????}}
Python与Java如何构建通信?请给出一个学习方向。
1、python提供restful接口,java直接调用restful api即可;
2、rpc通信,现成框架例如grpc。 java 和python都支持。
3、消息队列,python计算结果存到消息队列,java端订阅处理即可。相当于引入一个中间代理角色。
思路大概就上面的方式,根据实际场景进行技术选型。
Python真是编程者的福利,Python和Java可以结合吗?
python语言现在至少有3种实现:
1.
用c实现的,叫cython(也是现在普遍使用的一种实现)。
2.
用java实现的,叫jython,可以直接访问java类库,生成字节码文件。所以,用jython的话,是完全可以与java结合使用的。
3.
用c#实现的,叫ironpython,可以直接访问.Net类库中的类,生成的是IL(中间语言)字节码文件。可以与所有.Net语言(c#、vb.net等)结合使用。
java和python怎么交互
你可以使用google的protocal buffer协议,这个协议还是比较有实用价值的。不同语言(当前只支持java,python和c++)可以对相同的模型进行操作,而且通过特殊的编码使得交互的数据量变得很小。
如果解决了您的问题请采纳!
如果未解决请继续追问!
protocal buffer,这个协议还是比较有实用价值的。不同语言(当前只支持java,python和c++)可以对相同的模型进行操作,而且通过特殊的编码使得交互的数据量变得很小。
~如果你认可我的回答,请及时点击【采纳为满意回答】按钮
~~手机提问的朋友在客户端右上角评价点【满意】即可。
~你的采纳是我前进的动力
~~O(∩_∩)O,记得好评和采纳,互相帮助,谢谢。
怎么在java的flink中调用python程序?
1. 在java类中直接执行python语句
此方法需要引用 org.python包,需要下载Jpython。在这里先介绍一下Jpython。下面引入百科的解释:
Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。
这里我建议下载最新版本的Jpython,因为可以使用的python函数库会比老版本的多些,目前最新版本为2.7。
下载jar包请点击Download Jython 2.7.0 - Standalone Jar
下载安装程序请点击Download Jython 2.7.0 - Installer
如果使用maven依赖添加的话,使用下面的语句
org.python
jython-standalone
2.7.0
以上准备好了,就可以直接在java类中写python语句了,具体代码如下:
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("a=[5,2,3,9,4,0]; ");
interpreter.exec("print(sorted(a));"); //此处python语句是3.x版本的语法
interpreter.exec("print sorted(a);"); //此处是python语句是2.x版本的语法
输出结果如下:这里会看到输出的结果都是一样的,也就是说Jpython兼容python2.x和3.x版本的语句,运行速度会比直接运行python程序稍慢一点。
但是每次运行结果都会提示console: Failed to install ”: java.nio.charset.UnsupportedCharsetException: cp0. 这样看起来很烦,因为每次运行结果都会出现红色的提示语句,以为是错误,程序员应该都不愿意看到这一幕,得想个办法解决。
解决方法如下:
在要执行的代码上右键, Run As>Run Configurations,选择第二个页签Arguments,在VM arguments中添加以下语句
-Dpython.console.encoding=UTF-8
然后Apply->Run就可以了。
Algorithm做算法题,Review点评英文文章,Tip总结技术技巧,Share做技术分享。每周打卡一次,这就是ARTS打卡。
1. 做算法题
LeetCdoe面试题 17.26. 稀疏相似度
题目描述:
两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。给定一系列的长篇文档,每个文档元素各不相同,并与一个 ID 相关联。它们的相似度非常“稀疏”,也就是说任选 2 个文档,相似度都很接近 0。请设计一个算法返回每对文档的 ID 及其相似度。只需输出相似度大于 0 的组合。请忽略空文档。为简单起见,可以假定每个文档由一个含有不同整数的数组表示。
输入为一个二维数组 docs,docs[i] 表示 id 为 i 的文档。返回一个数组,其中每个元素是一个字符串,代表每对相似度大于 0 的文档,其格式为 {id1},{id2}: {similarity},其中 id1 为两个文档中较小的 id,similarity 为相似度,精确到小数点后 4 位。以任意顺序返回数组均可。
示例:输入:
[
[14, 15, 100, 9, 3],
[32, 1, 9, 3, 5],
[15, 29, 2, 6, 8, 7],
[7, 10]
]
输出:
[
“0,1: 0.2500”,
“0,2: 0.1000”,
“2,3: 0.1429”
]
解题思路:
Python中集合有交和并运算,将题目中的列表转换为集合后可得到交集、并集大小。题目的难点在于相似度保留4位小数。由于计算机二进制无法精确表示浮点数,round函数做四舍五入可能不精确,为了消除二进制存储浮点数会截断(变小)的影响,浮点数加上1e-9后进行round计算。
解题代码:
class Solution:
def computeSimilarities(self, docs: List[List[int]]) -> List[str]:
def div_fun(x:int, y:int) -> str:
div = x / y + 1e-9
div_str = str(round(div, 4))
if len(div_str) < 6:
div_str = div_str + '0'*(6-len(div_str))
return div_str
L_str = []
for i in range(len(docs)):
docs[i] = set(docs[i])
for i in range(len(docs)):
for j in range(i+1, len(docs)):
intersection_ij = docs[i] & docs[j]
union_ij = docs[i] | docs[j]
if len(intersection_ij) == 0:
continue
else:
similarity_ij = div_fun(len(intersection_ij),len(union_ij))
L_str.append(str(i)+','+str(j)+': '+similarity_ij)
return L_str
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2.点评英文文章
文章《What is Python Good for?》是一名Java程序员写的,推荐使用Python作为一项兵器加入到程序员的武器库中。文中列举了Python的诸多优点,总结一下主要是易上手、生态丰富、框架成熟、应用广泛,就像AK47自动步枪。
3. 技术技巧
独立博客想要引导到微信公众号上,除了在文章末尾放一张公众号的二维码,还有什么办法呢?可以使用openwrite实现readmore功能,需要关注微信公众号,从公众号获取验证码才能继续阅读文章。
4. 技术分享
学习PyFlink教程,python与flink结合是发展的必然,python应用于数据分析和机器学习领悟,flink应用于大数据流计算领悟,两者结合互相提升。将flink的能力输出python用户,python生态的计算功能运行到flink上,相辅相成。目前pyflink1.11可支持python数据处理库pandas,并可实现kmeans等算法。
一、在java类中直接执行python语句
import org.python.util.PythonInterpreter;
public class FirstJavaScript {
public static void main(String args[]) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");
interpreter.exec("print days[1];");
}// main
}
调用的结果是Tue,在控制台显示出来,这是直接进行调用的。
二、在java中调用本机python脚本中的函数
首先建立一个python脚本,名字为:my_utils.py
def adder(a, b):
return a + b
然后建立一个java类,用来测试,
java类代码 FirstJavaScript:
import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
public class FirstJavaScript {
public static void main(String args[]) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("C:\\Python27\\programs\\my_utils.py");
PyFunction func = (PyFunction) interpreter.get("adder",
PyFunction.class);
int a = 2010, b = 2;
PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));
System.out.println("anwser = " + pyobj.toString());
}// main
}
得到的结果是:anwser = 2012
三、使用java直接执行python脚本
建立脚本inputpy
#open files
print 'hello'
number=[3,5,2,0,6]
print number
number.sort()
print number
number.append(0)
print number
print number.count(0)
print number.index(5)
建立java类,调用这个脚本:
import org.python.util.PythonInterpreter;
public class FirstJavaScript {
public static void main(String args[]) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("C:\\Python27\\programs\\input.py");
}// main
}
得到的结果是:
hello
[3, 5, 2, 0, 6]
[0, 2, 3, 5, 6]
[0, 2, 3, 5, 6, 0]
2
3
Java怎么调用pyd文件
答非所问
在做项目的时候,有的时候由于合作人员之间所会的编程语言的不同,会导致项目合作中的一些问题,很多时候需要不同语言之间的调用,这次就分享一下java调用python代码的东西。
在做项目的时候,有的时候由于合作人员之间所会的编程语言的不同,会导致项目合作中的一些问题,很多时候需要不同语言之间的调用,这次就分享一下java调用python代码的东西。
一、python代码运行
巧妇难为无米之炊。首先,要确保python环境配置完好,并且相应的python代码可以运行。这个就不在这里进行讲述了,如果有需要可以查看我之前的一些文章。
二、java调用python代码
1、查阅了一些网上资料,看到了很多介绍使用jython调用python代码的例子,不过由于一些原因我没有尝试这个方法,而是直接测试了Runtime.getRuntime().exec(args)这个java库中自带的方法,下面直接切入主题。
2、先直接上代码:
python代码(helloword.py):
# coding:utf-8import numpy as np if __name__ == '__main__':a = np.ones(3)print(a) print '恭喜您!java调用python代码成功'
java代码(MyDemo.java):
import java.io.BufferedReader;import java.io.InputStreamReader;public class MyDemo { public static void main(String[] args) { try {System.out.println("start");String[] args1=new String[]{"/home/huan/anaconda2/bin/python","/home/huan/myfile/pythonfile/helloword.py"};Process pr=Runtime.getRuntime().exec(args1);BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));String line; while ((line = in.readLine()) != null) {System.out.println(line);}in.close();pr.waitFor();System.out.println("end");} catch (Exception e) {e.printStackTrace();}}}
执行结果:
需要注意的是此行代码:
String[] args1=new String[]{"/home/huan/anaconda2/bin/python","/home/huan/myfile/pythonfile/helloword.py"};
这句代码是很重要的,首先一定要设置好你所使用的python的位置,切记不要直接使用python,因为系统会默认使用自带的python,所以一定要设置好你所使用的python的位置,否则可能会出现意想不到的问题(比如说我使用的是anaconda中的python,而ubuntu系统会默认调用自带的python,而我自带的python中并没有numpy库,所以会造成相应的代码不会执行的问题,所以设置好python的位置是很重要的)。还有就是要设置好py文件的位置,使用绝对路径。
还有就是可以看出,此方法可以满足我们python代码中调用第三方库的情况,简单实用。
三、java中向python代码动态传参
python代码(helloword.py):
# coding:utf-8import numpy as npimport sys if __name__ == '__main__':a = np.ones(3)print(a) print '恭喜您!java调用python代码成功'print '脚本名为:%s'%(sys.argv[0]) print '传入的参数为:'for i in range(1, len(sys.argv)): print '参数:%s'%(sys.argv[i])
java代码(MyDemo.java):
import java.io.BufferedReader;import java.io.InputStreamReader;public class MyDemo { public static void main(String[] args) { try {System.out.println("start");String para1="time";String para2="sfdjk";String[] args1 = new String[]{"/home/huan/anaconda2/bin/python", "/home/huan/myfile/pythonfile/helloword.py",para1,para2};Process pr = Runtime.getRuntime().exec(args1);BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));String line; while ((line = in.readLine()) != null) {System.out.println(line);}in.close();pr.waitFor();System.out.println("end");} catch (Exception e) {e.printStackTrace();}}}
代码运行结果为:
好了,多余的话就不说了,一切尽在代码中。此处的分享就到这里了。
如何将java程序的数据传递至python
java程序的数据传递至python:
1、首先建立一个python脚本,名字为:my_utils.py
def adder(a, b):
return a + b
2、java类代码 FirstJavaScript:
import javax.script.*;
import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
import java.io.*;
import static java.lang.System.*;
public class FirstJavaScript
{
public static void main(String args[])
{
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("C:\\Python27\\programs\\my_utils.py");
PyFunction func = (PyFunction)interpreter.get("adder",PyFunction.class);
int a = 2010, b = 2 ;
PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));
System.out.println("anwser = " + pyobj.toString());
}//main
}
建立java与python的接口,让java能调用python脚本。请问可以用什么方式?
试试RPC吧。。实在不行SOAP
不建议研究jython。比较简单的思路是把python脚本完全当做一个外部程序,用shell方式调用它。
首先设计好python脚本的接口,把参数用命令行方式传入,然后输出打印出来。示例:
$ python func.py arg1 arg2
result
然后在java里就可以用Runtime来执行shell命令,解析输出字符串然后得到结果。