2021-04-16 13:43发布
Jython是一个Python语言在Java中的完全实现(详细解释看另一篇博客Python语法基础的第一部分)。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类(反射使Jython能无缝地使用任何Java类。)。这使其有一个巨大的资源库。
虽然上述网络上对Jython的描述看似很美好,但在实际使用的过程中会遇到很多的问题。最大的问题就是Jython在2015年停止更新,目前最新的是 Jython 2.7.0 Final Released(May 2015)。这就会导致Jython无法使用一些新的CPython库。当你只是想要使用Jython编写一些与Java程序混合的、简单的代码时是比较简单的——但是**当你的程序需要导入很多外部库时,Jython总会出现问题。**而且Jython的运行效率也不快。种种原因,最终没有使用Jython。
在Java中使用Jython调用Python中的方法:
首先加入Jython包,这里就有第一个坑,要注意添加的是jython-2.7-b1.jar而不是jython.jar。
import java.io.IOException;
import org.python.core.Py;
import org.python.core.PyFunction;
import org.python.core.PyObject;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;
public class JythonMethod {
public static void main(String[] args) throws IOException {
PySystemState sys = Py.getSystemState();
System.out.println(sys.path.toString());
//由于Jython和JVM的ClassPath不一样,所以需要手动加入项目所需的库文件路径
sys.path.add("xxx\\libs");//项目库文件
sys.path.add("xxx\\Lib");//Python自带库文件
// 1. Python面向函数式编程: 在Java中调用Python函数
String pythonFunc = "./xxx/xxx.py";//Python文件路径
//在JVM中创建一个“Python解释器”对象
PythonInterpreter pi1 = new PythonInterpreter();
// 加载python程序
pi1.execfile(pythonFunc);
// 调用Python程序中的函数
PyFunction pyf = pi1.get("methodName", PyFunction.class);
//写入方法所需的参数,注意要转换为Python的相应类型
PyObject Res = pyf.__call__(Py.newString("xxx1"),Py.newString("xxx2"));
System.out.println(Res);
pi1.cleanup();
}
————————————————
终端(命令行)调用就是老生常谈的东西了,直接使用Java代码执行一段终端(命令行)命令来调用Python文件,简单粗暴。
但这种方式也存在以下问题:
对多线程的支持不好,在部署到服务器的情况下,每次运行都会开启一个终端,消耗资源。
这种方法无法像调用一个方法一样随意传参,毕竟是命令行执行,参数选择无法像内置方法一样随意选择。
使用命令行运行Python脚本:
在以下代码中,我开启了3个线程执行一个Python脚本,脚本耗时3秒,在任务管理器里可以看到程序会开启三个终端。
import java.io.BufferedReader;
import java.io.InputStreamReader;
class RunnableDemo implements Runnable {
String name = null;
public RunnableDemo(String name) {
this.name = name;
public void run() {
//命令行参数(注意先把Python加入环境变量)
String[] arguments = new String[] { "python", "C:/xxx/xxx.py", "arg1", "arg2"};
try {
Process process = Runtime.getRuntime().exec(arguments);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
in.close();
int re = process.waitFor();
System.out.println(re);
} catch (Exception e) {
e.printStackTrace();
public class RuntimeMethod {
public static void main(String[] args) throws IOException, InterruptedException {
RunnableDemo r1 = new RunnableDemo( "Thread1");
Thread t1 = new Thread(r1);
t1.start();
RunnableDemo r2 = new RunnableDemo( "Thread2");
Thread t2 = new Thread(r2);
t2.start();
RunnableDemo r3 = new RunnableDemo( "Thread3");
Thread t3 = new Thread(r3);
t3.start();
一、在java类中直接执行python语句
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脚本中的函数
import org.python.core.PyInteger;
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());
得到的结果是:anwser = 2012
三、使用java直接执行python脚本
interpreter.execfile("C:\\Python27\\programs\\input.py");
四:如若python文件中有引入第三方库如numpy,sklearn,pandas等,可以通过java调用进程的方式
基本思路:通过java调用cmd,传入Python 命令,然后传入参数,通过获取到Python文件中的print,获取返回值
使用方式,将数据txt文件路径通过参数形式,传给Python且运行读取数据,最后java获取python的print的数据。
public static void main(String args[]){
try{
System.out.println("start");
String[] pythonData =new String[]{"python 运行的命令","py文件路径","测试传参数据文件路径"};
//读取到python文件
Process pr = Runtime.getRuntime().exec(pythonData);
InputStreamReader ir = new InputStreamReader(pr.getInputStream());
LineNumberReader in = new LineNumberReader(ir);
String line ;
//获取到python中的所有print 数据,
while((line=in.readLine()) != null){
System.out.println("python print data"+line);
ir.close();
pr.waitFor();
System.out.println("end");
}catch(Exception e){
不建议研究jython。比较简单的思路是把python脚本完全当做一个外部程序,用shell方式调用它。 首先设计好python脚本的接口,把参数用命令行方式传入,然后输出打印出来。示例: $ python func.py arg1 arg2 result 然后在java里就可以用Runtime来执行shell命令,解析输出字符串然后得到结果。
1.在java类中直接执行python语句
jython不用第三方库,JDK自带了,直接java命令行就可以调用pthyon跟shell脚本一个道理,你直接用java 的System.getRuntime().exec(),像执行一个操作系统的脚本一样调用即可
Java
方式1:创建接口的非匿名实现类的非匿名对象
方式2: 创建接口的非匿名实现类的匿名对象
方式3: 创建接口的匿名实现类的非匿名对象
方式4: 创建接口的匿名实现类的匿名对象
换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...
十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...
前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...
迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...
python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写
第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...
head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...
挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了
Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...
相当于 ... 这里不是注释
还有FIXME
python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。
单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:# 单行注释print(hello world)注释可以放在代码上面也可以放在代...
主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...
或许是里面有没被注释的代码
自学的话要看个人情况,可以先在B站找一下视频看一下
最多设置5个标签!
Jython是一个Python语言在Java中的完全实现(详细解释看另一篇博客Python语法基础的第一部分)。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类(反射使Jython能无缝地使用任何Java类。)。这使其有一个巨大的资源库。
虽然上述网络上对Jython的描述看似很美好,但在实际使用的过程中会遇到很多的问题。最大的问题就是Jython在2015年停止更新,目前最新的是 Jython 2.7.0 Final Released(May 2015)。这就会导致Jython无法使用一些新的CPython库。当你只是想要使用Jython编写一些与Java程序混合的、简单的代码时是比较简单的——但是**当你的程序需要导入很多外部库时,Jython总会出现问题。**而且Jython的运行效率也不快。种种原因,最终没有使用Jython。
在Java中使用Jython调用Python中的方法:
首先加入Jython包,这里就有第一个坑,要注意添加的是jython-2.7-b1.jar而不是jython.jar。
import java.io.IOException;
import org.python.core.Py;
import org.python.core.PyFunction;
import org.python.core.PyObject;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;
public class JythonMethod {
public static void main(String[] args) throws IOException {
PySystemState sys = Py.getSystemState();
System.out.println(sys.path.toString());
//由于Jython和JVM的ClassPath不一样,所以需要手动加入项目所需的库文件路径
sys.path.add("xxx\\libs");//项目库文件
sys.path.add("xxx\\Lib");//Python自带库文件
System.out.println(sys.path.toString());
// 1. Python面向函数式编程: 在Java中调用Python函数
String pythonFunc = "./xxx/xxx.py";//Python文件路径
//在JVM中创建一个“Python解释器”对象
PythonInterpreter pi1 = new PythonInterpreter();
// 加载python程序
pi1.execfile(pythonFunc);
// 调用Python程序中的函数
PyFunction pyf = pi1.get("methodName", PyFunction.class);
//写入方法所需的参数,注意要转换为Python的相应类型
PyObject Res = pyf.__call__(Py.newString("xxx1"),Py.newString("xxx2"));
System.out.println(Res);
pi1.cleanup();
}
}
————————————————
终端(命令行)调用就是老生常谈的东西了,直接使用Java代码执行一段终端(命令行)命令来调用Python文件,简单粗暴。
但这种方式也存在以下问题:
对多线程的支持不好,在部署到服务器的情况下,每次运行都会开启一个终端,消耗资源。
这种方法无法像调用一个方法一样随意传参,毕竟是命令行执行,参数选择无法像内置方法一样随意选择。
使用命令行运行Python脚本:
在以下代码中,我开启了3个线程执行一个Python脚本,脚本耗时3秒,在任务管理器里可以看到程序会开启三个终端。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class RunnableDemo implements Runnable {
String name = null;
public RunnableDemo(String name) {
this.name = name;
}
public void run() {
//命令行参数(注意先把Python加入环境变量)
String[] arguments = new String[] { "python", "C:/xxx/xxx.py", "arg1", "arg2"};
try {
Process process = Runtime.getRuntime().exec(arguments);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
int re = process.waitFor();
System.out.println(re);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class RuntimeMethod {
public static void main(String[] args) throws IOException, InterruptedException {
RunnableDemo r1 = new RunnableDemo( "Thread1");
Thread t1 = new Thread(r1);
t1.start();
RunnableDemo r2 = new RunnableDemo( "Thread2");
Thread t2 = new Thread(r2);
t2.start();
RunnableDemo r3 = new RunnableDemo( "Thread3");
Thread t3 = new Thread(r3);
t3.start();
}
}
一、在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脚本中的函数
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脚本
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
}
四:如若python文件中有引入第三方库如numpy,sklearn,pandas等,可以通过java调用进程的方式
基本思路:通过java调用cmd,传入Python 命令,然后传入参数,通过获取到Python文件中的print,获取返回值
使用方式,将数据txt文件路径通过参数形式,传给Python且运行读取数据,最后java获取python的print的数据。
public static void main(String args[]){
try{
System.out.println("start");
String[] pythonData =new String[]{"python 运行的命令","py文件路径","测试传参数据文件路径"};
//读取到python文件
Process pr = Runtime.getRuntime().exec(pythonData);
InputStreamReader ir = new InputStreamReader(pr.getInputStream());
LineNumberReader in = new LineNumberReader(ir);
String line ;
//获取到python中的所有print 数据,
while((line=in.readLine()) != null){
System.out.println("python print data"+line);
}
ir.close();
in.close();
pr.waitFor();
System.out.println("end");
}catch(Exception e){
e.printStackTrace();
}
}
1.在java类中直接执行python语句
2.在java中直接调用python脚
3.使用Runtime.getRuntime()执行python脚本文件,推荐使用
4.调用python脚本中的函数
jython不用第三方库,JDK自带了,直接java命令行就可以调用
pthyon跟shell脚本一个道理,你直接用java 的System.getRuntime().exec(),像执行一个操作系统的脚本一样调用即可
Java
方式1:创建接口的非匿名实现类的非匿名对象
方式2: 创建接口的非匿名实现类的匿名对象
方式3: 创建接口的匿名实现类的非匿名对象
方式4: 创建接口的匿名实现类的匿名对象
相关问题推荐
换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...
十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...
前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...
迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...
python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写
第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...
head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...
挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了
Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...
相当于 ... 这里不是注释
还有FIXME
python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。
单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:# 单行注释print(hello world)注释可以放在代码上面也可以放在代...
主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...
或许是里面有没被注释的代码
自学的话要看个人情况,可以先在B站找一下视频看一下