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