代码迁移攻略:在Java工程中调用Python代码


Python是一门好用的脚本语言,底层基于C实现,快速且简单。使用python可以说是站在巨人肩膀上编程,使得程序员更专注于业务及逻辑,而不是被人学烂的语言工具。但是团队合作时候,就会有一些多语言编程,然后集成的问题,例如我遇到的Java和Python。为了方便非Python程序员能够使用写好的python程序,需要考虑两个方面:
– 环境是否可迁移,在没有python环境的机器上如何运行。
– Java如何实现与python的交互。


环境迁移
方案一
(1) 安装python环境,写入path路径
(2) 保证pip可以正常使用,cmd切换到路径下:c:/Python27/Scripts>pip
(3) pip install -r requirement.txt
site-packages里面放的是第三方包。包可以通过import 引入程序中。 因此,需要提前写好requirement.txt文件,包含一堆依赖

方案二
将python打包成exe,可以在无python环境的windows环境下运行python代码。有两个工具可供使用:
Py2exe:
python2.7 对应0.6.9版本的py2exe,需要另外创建setup.py,且不支持win64. 具体见:python打包程序py2exe实战
PyInstaller:
推荐使用,
(1)首先安装:pip install pyinstaller
(2)开始打包成exe

  • 命令提示符cd 到需要打包的文件的目录
  • 直接在命令提示符中输入pyinstaller -F 文件名.py 注意F要大些,呵呵就这么简单
  • 打包成功后会出现两个文件夹,其中一个就是所需要的exe文件;
    注:若是gui文件可以在输入pyinstaller -F -w文件名.py 其中w是小写,意思就是五命令行窗口,默认的是-c有命令行窗口,当然一般的文件也可以-w,这样命令行窗口就没有了。
    pyinstaller 的其他常用的参数
  • “- -icon=图标路径”
  • “-F 打包成一个exe文件”
  • “-w 使用窗口,无控制台”
  • “-c 使用控制台,无窗口”
  • “-D 创建一个目录,里面包含exe以及其他一些依赖性文件 还有一些可以通过pyinstaller -h 来查看参数”
    例如:
    C:\Users\Desktop\exe>pyinstaller -F c:/helloworld.py
    exe存放地址> pyinstaller -F 目标文件

Java如何实现与python的交互。
**解决:**文件读写。Java输出的数据,交给python读取并处理。python输出处理结果到文件,Java读取并进行后续工作。
Java中运行python脚本的三种方式
(1) 直接执行Python脚本代码
引用 org.python包

PythonInterpreter interpreter = new PythonInterpreter();  
interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");   ///执行python脚本

(2) 执行python .py文件

PythonInterpreter interpreter = new PythonInterpreter();  
InputStream filepy = new FileInputStream("D:\\demo.py"); 
interpreter.execfile(filepy);  ///执行python py文件
filepy.close();

(3)使用Runtime.getRuntime()执行脚本文件
这种方式和.net下面调用cmd执行命令的方式类似。如果执行的python脚本有引用第三方包的,建议使用此种方式。使用上面两种方式会报错java ImportError: No module named arcpy。

Process proc = Runtime.getRuntime().exec("python  D:\\demo.py");  
proc.waitFor(); 

使用第三种方法如何获取python返回值:
process可以从python拿到流,然后重新在java里把这个流在java里初始化,就可以获取返回值,举个例子:

/执行
    private void playRunTime() throws Exception {
        String cmd = "adb version";
        Process p = Runtime.getRuntime().exec(cmd);
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String line;
        while ((line = reader.readLine()) != null) {
            tv_result.append(line + "\n");
        }
        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }

具体机制请看: https://blog.csdn.net/qq_26787115/article/details/52963013

参考文献:
Java运行Python脚本的几种方式
第一次迁移一个 Python 项目
python打包py2exe和pyinstaller

Java调用Python

转载自:https://blog.csdn.net/ztf312/article/details/51087821

You may also like...