java调用python脚本
1.需求背景
在开发过程中,面临的使用java调用python的脚本程序,在此背景下就需要程序能够调用python脚本。调用python脚本有以下几种情况,不带参数调用python脚本,动态传参数调用python脚本,调用python脚本中的某个方法,以下将讲解如何实现上述需求。
代码在windows系统上运行,需要提前安装python的运行环境,linux系统上默认安装了python2的运行环境。
2.不带参数调用python脚本
2.1编写测试python脚本
D:\python\pycharm\pycharmProjects\java-python\Test01\Python01.py
def print_str():
print("python程序已经执行")
if __name__ == '__main__':
print_str()
2.2编写java程序
a.导入maven的jar包
<!-- https://mvnrepository.com/artifact/org.python/jython -->
<dependency>
<groupId>org.python</groupId>
<artifactId>jython</artifactId>
<version>2.7.1b3</version>
</dependency>
b.编写java代码
import org.python.util.PythonInterpreter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Properties;
public class Java01 {
public static void main(String[] args) {
System.out.println("-----方式一-----");
Properties props = new Properties();
//python的Lib库的位置
//props.put("python.home", "C:\\Program Files\\Anaconda3\\Lib");
props.put("python.console.encoding", "UTF-8");
props.put("python.security.respectJavaAccessibility", "false");
//注意:如果没有这一条会有Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site报错
props.put("python.import.site", "false");
Properties preprops = System.getProperties();
//python解释器
PythonInterpreter.initialize(preprops, props, new String[0]);
PythonInterpreter interpreter = new PythonInterpreter();
//执行python脚本,并且直接把python脚本执行的输出打印到控制太上
interpreter.execfile("D:\\python\\pycharm\\pycharmProjects\\java-python\\Test01\\Python01.py");
interpreter.close();
System.out.println("-----方式二-----");
try {
//设置命令行传入参数
String[] parameters = new String[] { "python", "D:\\python\\pycharm\\pycharmProjects\\java-python\\Test01\\Python01.py"};
Process pr = Runtime.getRuntime().exec(parameters);
//获取程序执行在控制台打印的内容
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gbk"));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
pr.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
c.运行结果
3.动态传参数调用python脚本
3.1编写测试python脚本
D:\python\pycharm\pycharmProjects\java-python\Test01\Python02.py
import sys
def adder(a, b):
c = int(a) + int(b)
return (c)
if __name__ == '__main__':
print("python程序已经执行")
print(adder(sys.argv[1], sys.argv[2]))
3.2编写java程序
a.导入maven的jar包
<!-- https://mvnrepository.com/artifact/org.python/jython -->
<dependency>
<groupId>org.python</groupId>
<artifactId>jython</artifactId>
<version>2.7.1b3</version>
</dependency>
b.编写java代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Java02 {
public static void main(String[] args) {
try {
//设置命令行传入参数
String[] parameters = new String[] { "python", "D:\\python\\pycharm\\pycharmProjects\\java-python\\Test01\\Python02.py", "20", "30"};
Process pr = Runtime.getRuntime().exec(parameters);
//遍历得到python在执行的时候在控制台上输出的内容
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gbk"));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
pr.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
c.输出结果
4.调用python脚本中的某个方法
4.1编写测试python脚本
D:\python\pycharm\pycharmProjects\java-python\Test01\Python03.py
def adder(a, b):
return (a + b)
if __name__ == '__main__':
print("我是python脚本里面的输出")
4.2编写java代码
a.导入maven的jar包
<!-- https://mvnrepository.com/artifact/org.python/jython -->
<dependency>
<groupId>org.python</groupId>
<artifactId>jython</artifactId>
<version>2.7.1b3</version>
</dependency>
b.编写java代码
import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
import java.util.Properties;
public class Java03 {
public static void main(String[] args) {
Properties props = new Properties();
//python的Lib库的位置
//props.put("python.home", "C:\\Program Files\\Anaconda3\\Lib");
props.put("python.console.encoding", "UTF-8");
props.put("python.security.respectJavaAccessibility", "false");
//注意:如果没有这一条会有Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site报错
props.put("python.import.site", "false");
Properties preprops = System.getProperties();
//python解释器
PythonInterpreter.initialize(preprops, props, new String[0]);
PythonInterpreter interpreter = new PythonInterpreter();
//python文件路径,先执行python脚本,python在控制台上的输出会打印到出来并且会加载的内存中,方便后面程序来调用其中的方法
interpreter.execfile("D:\\python\\pycharm\\pycharmProjects\\java-python\\Test01\\Python03.py");
//这样得到了指定的函数
PyFunction function = interpreter.get("adder", PyFunction.class);
//给函数传入参数,这里不会有代码提示,所以要保证参数类型与数量正确,否则会报错
int a = 3;
int b = 4;
PyObject pyobj = function.__call__(new PyInteger(a), new PyInteger(b));
System.out.println(pyobj.toString());
}
}
c.输出结果
参考:https://blog.csdn.net/IT_xiao_bai/article/details/79074988