JAVA 调用Python的两种实现方式

尉迟边浩
2023-12-01

 

摘要: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();
        }
    }

}



 

 类似资料: