代码迁移攻略:在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

发布了392 篇原创文章 · 获赞 492 · 访问量 241万+
展开阅读全文

Python程序转成java程序输出结果不对

10-30

Python程序如下: ``` import base64 import hashlib def encode_64(string,key): key = hashlib.md5(key.encode('utf-8')).hexdigest() print key key_length = len(key) string = hashlib.md5((string+key).encode('utf-8')).hexdigest()[0:8]+string print string rndkey = [] box = [] for i in range(0,256): rndkey.append(ord(key[i%key_length])) box.append(i) j = 0 for i in range(0,256): j = (j+box[i]+rndkey[i])%256 tmp = box[i] box[i] = box[j] box[j] = tmp a = 0 j = 0 result = "" for i in range(len(string)): a = (a+1)%256 j = (j+box[a])%256 tmp = box[a] box[a] = box[j] box[j] = tmp result += chr(ord(string[i])^(box[(box[a]+box[j])%256])) result = base64.b64encode(result) return result.replace('=','') string = encode_64("passw0rd","toyou") print string ``` java程序如下: ``` package nimp; import java.security.MessageDigest; import sun.misc.BASE64Encoder; public class JM { private static MessageDigest md5 = null; static { try { md5 = MessageDigest.getInstance("MD5"); } catch (Exception e) { System.out.println(e.getMessage()); } } /** * 用于获取一个String的md5值 * @param string * @return */ public static String getMd5(String str) { byte[] bs = md5.digest(str.getBytes()); StringBuilder sb = new StringBuilder(40); for(byte x:bs) { if((x & 0xff)>>4 == 0) { sb.append("0").append(Integer.toHexString(x & 0xff)); } else { sb.append(Integer.toHexString(x & 0xff)); } } return sb.toString(); } public static String enc(String string) throws Exception{ String result = ""; String key = getMd5("toyou"); System.out.println(key); int key_length = key.length(); char[] keyc = key.toCharArray(); string = getMd5(string+key).substring(0, 8) + string; System.out.println(string); int string_length = string.length(); int[] rndkey = new int[256]; int[] box = new int[256]; int i,j; for(i=0;i<=255;i++){ rndkey[i] = (int)keyc[i%key_length]; box[i] = i; } i = 0;j = 0; for(;i<=255;i++){ j = (j+box[i]+rndkey[i])%256; int x = box[i]; box[i] = box[j]; box[j] = x; } int a=0; i = 0;j = 0; int[] r = new int[string_length]; char[] re = new char[string_length]; System.out.println(string_length); for(;i<string_length;i++){ a = (a+1)%256; j = (j+box[a])%256; int x = box[a]; box[a] = box[j]; box[j] = x; int y = ((int)string.toCharArray()[i])^(box[(box[a]+box[j])%256]); r[i] = y; System.out.println(y); result += (char)y; re[i] = (char)y; System.out.println(re[i]); } System.out.println(result); System.out.println(String.valueOf(re)); result = new BASE64Encoder().encode(result.getBytes("utf-8")); result.replace("=", ""); return result; } public static void main(String[] args) throws Exception { // TODO Auto-generated method stub System.out.println(enc("passw0rd")); } } ``` 我自己测了测是从ASCII转字符那开始两个程序不同的,求解决办法 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览