摘要:jpython是python编程语言的100%存JAVA实现。将Python源代码编译成JAVA字节码,并在任何JAVA虚拟机上运行产生的字节码。Jpython是与JAVA的最大无缝平滑集成连接。
Cpython | 是python的参考实现,C编写,把Python编译成中间态的字节码,然后有虚拟机解释 | Anaconda里面用到了CPython,几乎包含了所有第三方库,但存在几个缺陷。1.全局锁使得Python在多线程效能上表现不佳。2.无法支持即时编译,导致执行速度不及JAVA和Javascipt。 |
PyPy | 是用Python自身实现的解释器。即时编译,提高性能,同时保持最大兼容性,比Cpython快5倍以上。 | 无法支持官方的C/Python API |
Jpython | 将Python代码编译成JAVA字节码的实现。运行在JVM上。可以像使用Python模块一样,导入并使用任何JAVA类。 |
|
IronPython | 针对.NET框架的Python实现,可以用Python和.NET famework的库。 |
|
PythonNet | 提供给本机已安装的Python.NET公共语言运行时(CLR)包,与IronPython互补。 |
|
方法1:jpython的使用
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.0</version>
</dependency>
JAVA代码
public static void main(String[] args) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("C:\\Users\\Dick\\Desktop\\demo.py");
PyFunction func = (PyFunction)interpreter.get("wdd",PyFunction.class);
Integer a = 10;
Integer b = 10;
PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));
System.out.println("anwser = " + pyobj.toString());
}
Python脚本
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)
def wdd(a, b):
print(a+b)
return a+b
print(wdd(1, 2))
def yyh(c, d):
return c+d
print(yyh(5, 8))
///
public class SimpleEmbedded {
public static void main(String[] args) throws PyException {
PythonInterpreter interp = new PythonInterpreter();
interp.exec("import sys");
interp.exec("print sys");
interp.set("a", new PyInteger(42));
interp.exec("print a");
interp.exec("x = 2 + 2");
PyObject x = interp.get("x");
System.out.println("x: " + x);
}
}
结果输出
$ javac SimpleEmbedded.java
$ java SimpleEmbedded
sys module
42
x: 4
$
方法2:Runtime调用
package javaToPython;
/**
* @author : Zheng Guoliang
* @version V1.0
* @Project: ToolsProject
* @Package javaToPython
* @Description:
* @date Date : 2019年08月24日 17:05
*/
import java.io.*;
/**
* 直接通过Runtime进行调用第三方程序
*/
public class RuntimeDemo {
/**
* 在Java中通过Runtime调用Python程序与直接执行Python程序的效果是一样的,
* 可以在Python中读取传递的参数,也可以在Java中读取到Python的执行结果。
* 需要注意的是,不能在Python中通过return语句返回结果,只能将返回值写入到标准输出流中,
* 然后在Java中通过标准输入流读取Python的输出值。
* @throws IOException
*/
public static void runtimeDemo() throws IOException {
String target_exe="python"; // 如果在其他环境运行,需要设定python安装路径:如:F:\tools\python3\python
String target_file="F:\\Code\\Python\\DataAnalyse\\day1_numpy.py";
String num1="12";
String num2="14";
String[] cmdArr=new String[]{target_exe,target_file,num1,num2};
Process process = Runtime.getRuntime().exec(cmdArr);
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));
char[] temp=new char[1024];
int len=-1;
StringBuilder strs=new StringBuilder();
while ((len=bufferedReader.read(temp))!=-1){
strs.append(temp,0,len);
}
System.out.println(strs.toString());
if (bufferedReader!=null){
bufferedReader.close();
}
}
public static void main(String[] args) {
try {
runtimeDemo();
} catch (IOException e) {
e.printStackTrace();
}
}
}