Java调⽤Python程序⽅法总结(最全最详细)
如何使⽤Java调⽤Python程序
本⽂为⼤家介绍如何java调⽤python⽅法,供⼤家参考。
实际⼯程项⽬中可能会⽤到Java和python两种语⾔结合进⾏,这样就会涉及到⼀个问题,就是怎么⽤Java程序来调⽤已经写好的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包请点击
下载安装程序请点击
如果使⽤maven依赖添加的话,使⽤下⾯的语句
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.0</version>
</dependency>
以上准备好了,就可以直接在java类中写python语句了,具体代码如下:
PythonInterpreter interpreter = new PythonInterpreter();
<("a=[5,2,3,9,4,0]; ");
<("print(sorted(a));");  //此处python语句是3.x版本的语法
<("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中添加以下语句
-
然后Apply->Run就可以了。
如下图所⽰:
2. 在java中调⽤本地python脚本
⾸先在本地建⽴⼀个python脚本,命名为add.py,写了⼀个简单的两个数做加法的函数,代码如下:
def add(a,b):
return a + b
python的功能函数已经写好,接下来我们写⼀个java的测试类(同样需要⽤到Jpython包),来测试⼀下是否可以运⾏成功。代码如下:import PyFunction;
import PyInteger;
import PyObject;
import org.python.util.PythonInterpreter;
public class Java_Python_test {
public static void main(String[] args) {
// TODO Auto-generated method stub
PythonInterpreter interpreter = new PythonInterpreter();
// 第⼀个参数为期望获得的函数(变量)的名字,第⼆个参数为期望返回的对象类型
PyFunction pyFunction = ("add", PyFunction.class);
int a = 5, b = 10;
//调⽤函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b));
System.out.println("the anwser is: " + pyobj);
}
}
运⾏结果如图所⽰:
OK,测试成功了~
关于Jpython更多详细的信息可以参考官⽅的相关⽂档,官⽹地址点。
:以上两个⽅法虽然都可以调⽤python程序,但是使⽤Jpython调⽤的python库不是很多,如果你⽤以上两个⽅法调⽤,注意:以上两个⽅法虽然都可以调⽤
⽽python的程序中使⽤到第三⽅库,这时就会报错java ImportError: No module named xxx。遇到这种情况推荐使⽤下⾯的⽅法,即可解决该问题。
3. 使⽤Runtime()执⾏脚本⽂件(推荐)
为了验证该⽅法可以运⾏含有python第三⽅库的程序,我们先写⼀个简单的python脚本,代码如下:
import numpy as np
a = np.arange(12).reshape(3,4)
print(a)
可以看到程序中⽤到了numpy第三⽅库,并初始化了⼀个3×4的⼀个矩阵。
下⾯来看看怎么⽤Runtime()⽅法来调⽤python程序并输出该结果,java代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Process proc;
try {
proc = Runtime().exec("python D:\\demo1.py");// 执⾏py⽂件
/
/⽤输⼊输出流来截取结果
BufferedReader in = new BufferedReader(new InputStream()));
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怎么读取py文件
可以看到运⾏成功了,但有的朋友可能会问了,怎么在python程序中函数传递参数并执⾏出结果,下⾯我就举⼀例来说明⼀下。
先写⼀个python的程序,代码如下:
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().exec(args1);// 执⾏py⽂件
BufferedReader in = new BufferedReader(new InputStream()));
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,以此类推。
最后结果如图所⽰:
OK,成功了。
最后补充⼀点:
本⼈电脑上由于同时存在两个python,⽽我不想⽤默认的那个,也不想修改默认的python解释器,这种情况下,可以写⼀个bat⽂件,在bat⽂件中通过dos命令切换到该python所在⽬录,然后运⾏py⽂件(py⽂件要放在该⽬录下)
下⾯附上程序:
bat⽂件:
@echo off
C:
cd C:\Anaconda2\envs\py3
start python test.py
exit
java程序:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Process proc;
try {
proc = Runtime().exec("cmd /c E:\\Faultdetection\\fault1\\run.bat");// 执⾏py⽂件
//⽤输⼊输出流来截取结果
BufferedReader in = new BufferedReader(new InputStream()));
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();
}
}
}
总结:以上就是Ja va调⽤pytho n程序的所有⽅法总结,推荐使⽤第三种⽅法,⽐前两种⽅便很多。最后,欢迎⼤家转载,转载请注明出处

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。