最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称拼写的人,所以,我将把我这一天内从配置环境到最终刚成功调用脚本的过程整理一下,分享给大家。


首先,我先大体上整理一下我的思路(以下以py代替python): 
1. py脚本如何运行? 
2. java中如何调用py脚本? 
3. 如何在java中向py脚本中动态传参。 
4. 运行发布

接下来,我将顺着以上三个方面的思路来分别介绍,并展示我因此踩过的坑。

一、 py脚本如何运行?

  1. 第一步当然是学习所有的语言都必备的:安装环境,此处不再赘述,给大家一个我参考的博客,非常详细。windows下python环境的安装 
    包括了安装环境到简单的运行语句等内容。
  2. 这样的话,我在本地已经可以运行出已经写好的py程序。
  3. 注意:这是我踩的第一个坑,在配置python环境时,要注意你当前运行的py脚本的版本,因为2.7和3.0两个版本的兼容不是很好,所以环境配置不相同时,可能会导致写好的py脚本出现语法错误,所以要注意这一点,选择相应版本的安装包。

二、java中如何调用py脚本?

关于java中如何调用py脚本,网上一搜就有很多种方法,我主要实践了其中两种,当然最后采用的一种也是有原因的,下文会详细解释。

1. 第一种,Jython 
什么是jython? 
他其实是一门语言,并非是Java 或者Python的解释器.用它可以实现,java和python代码的互相访问。 
如何使用jython? 
如何使用Jython 
所需jar包: 
为什么最终没有选择使用jython? 
这是我踩过的第二个坑,上面引用的的jython教程,几个例子都能很好的运行,函数传参也非常方便,但在运行现有的demo.py时,却一直在报下面这个错: 
 
查询过后,发现是java项目中引包不全的问题,但是基于我对py的了解之少,我放弃了这个集成好的方法,毕竟需要一点对py的了解。这个等以后有时间再做研究。

2.于是在放弃jython之后,我还是采用了java自带的命令行执行py Runtime.getRuntime().exec(args),然后采用输出流的方式用来获取参数。 
在封装好的py脚本的情况下,如果你不需要传入参数而只需要执行这个py文件的话,那么直接百度就可以获取得到很多写好的代码,我这里提供一种我这次使用的:

        try {Process pr = Runtime.getRuntime().exec("python G:\\test.py");BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); String line; while ((line = in.readLine()) != null) { line = decodeUnicode(line); System.out.println(line); } in.close(); pr.waitFor(); System.out.println("end"); } catch (Exception e) { e.printStackTrace(); }

然后看到这里,只需要修改Runtime.getRuntime().exec(“”)中的参数改为自己相应的文件路径即可,就可以轻松结束本次分享,但是,总有但是,我们大多数情况下调用一个复用的部分,都是为了传入不同的参数以获取相应的结果,那么请继续往下看。

三、如何在java中向py脚本中动态传参。

  1. 首先,先来一起明确一个概念,向脚本中动态传参,我一开始就很难理解,一个java的参数如何转为py的参数呢?但是,脚本就是可以直接用命令行运行的,具体是什么意思呢?我也不太清楚,但是我在询问不同人的不同方法之下,找到了一种自己能够会用并且能够理解的方法。具体参见:Python获得命令行传参
  2. 那么一言不合上代码吧: 
    Java代码:
try {//需传入的参数String a = getPara("car").substring(1), b = "D3455054", c = "LJ12GKS28D4418248", d = "qingdao"; System.out.println("start;;;" + a); //设置命令行传入参数 String[] args = new String[] { "python", "/api_test.py", a, b, c, d }; Process pr = Runtime.getRuntime().exec(args); BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); String line; while ((line = in.readLine()) != null) { line = decodeUnicode(line); System.out.println(line); } in.close(); pr.waitFor(); System.out.println("end"); } catch (Exception e) { e.printStackTrace(); }

py代码:

import sys
print "脚本名:", sys.argv[0]
for i in range(1, len(sys.argv)): print "参数", i, sys.argv[i]

运行结果: 

那么,酱紫就大功告成啦。你只需要根据py脚本中所需要的参数传进去就好啦。

运行发布

运行发布有什么好说的呢? 
这里也有一点需要注意的,就是服务器环境的配置,linux一般都是集成好的,其他的我不太清楚,但是最重要的一点,在上线调试时,一定要注意py文件的路径存放问题。就酱。

总结

从一开始的完全摸不到头脑,到现在能够调用成功,这不到一天的时间,压力却是很大的,面对未知的知识,无从下手的感觉我想大家也都经历过,但在这里,我十分想感谢那些无私帮助我的旁友们~多交流一下,别人不一定有时间能帮你解决,但能够提供思路的情况下,就能够早一点找到正确的方向,比如”Python获得命令行传参“这个东西,我一开始真是连百度搜索什么都不知道,搜到的东西可能跟你需要的完全不搭边,那么有一个方向也是好的。当然,这个方向完全正确,奠定了后面动态传参能够成功的基础,哈哈。 
这个博客只显示了我的一个特点:我不生产博客,我只是博客的搬运工~

附录:遗留问题

项目中获取到的中文参数,一向py脚本中传参就显示乱码,只有中文出现这个情况,到目前也没有找到解决方法,那么现在采用了一种曲线救国的方式,但是非常的不好,然而目前并没有发现更好的解决方法,放在这里待以后继续研究,或者大家能有什么好方法也希望能够多多交流~

原文地址:https://blog.csdn.net/thorny_v/article/details/61417386

转载于:https://www.cnblogs.com/jingsupo/p/java-python.html

在Java中动态传参调用Python脚本相关推荐

  1. C语言与java中函数传参比较

    C语言与java中函数传参比较 首先先说结论:C语言中参数传递有值传递,地址传递,引用传递.但java中的参数传递只有值传递 1.C语言中的参数传递 1>值传递 值传递非常好理解,其实就是对函数 ...

  2. java void传参,Java中的传参

    变量有两种类型根本类型和类类型 参数也是变量,所以传参分为 根本类型传参 类类型传参 过程1:根本类型传参 根本类型传参 在办法内,无法修改办法外的根本类型参数 publicclassHero{ St ...

  3. linux 动态传参执行shell脚本

    举个栗子: 我想执行的命令如下 /usr/bin/soffice --headless --invisible --convert-to pdf 3.doc 但是这样命令就写死了,如何动态传参数,执行 ...

  4. java中的传参是什么意思_如果作为参数传递,“字符串…参数”是什么意思?...

    我在网上找到了这段代码,其中有一部分我不理解.对于doInBackground方法,传递的参数为String...params.有人可以告诉我这是什么意思吗?那是...什么 public class ...

  5. 08 java中方法传参的传值与传址问题

    个人介绍 大家好我是:一颗松 认真分享技术,记录学习点滴 如果分享对你有用请支持我哦 点赞:留言: 收藏: 个人格言: 想法落实的最佳时机就是现在! :::info

  6. windows10中java调用python脚本

    文章目录 1. windows基础环境 1.1 java安装 1.1.1 下载jdk(版本可自选) 1.1.2 安装jdk 1.1.3 配置java环境变量 1.2 python安装 1.2.1 py ...

  7. sql 不为空_sql动态传参在springData中的应用(补充)

    在之前的文章提到过关于sql动态传参在springData中的应用,下面补充一下关于原生sql和springData的同一需求下的两种不同的写法: 需求:contoller层传递一个map给servi ...

  8. 中给函数赋读权限_sql动态传参在springData中的应用(补充)

    在之前的文章提到过关于sql动态传参在springData中的应用,下面补充一下关于原生sql和springData的同一需求下的两种不同的写法: 需求:contoller层传递一个map给servi ...

  9. Java调用Python脚本:轻松实现两种语言的互操作性

    Java和Python都是非常流行的编程语言,它们都有自己的优点,但也有自己的局限性.在编写应用程序时,我们可能需要使用两种语言来共同完成一项任务.在这种情况下,Java需要调用Python脚本来解决 ...

最新文章

  1. keras环境如何使用GPU
  2. Red hat linux 下配置Java环境(jdk)
  3. python创建子进程_Python--- subprocess 创建子进程
  4. Sublime Text Version 3.0,Build3143注册码
  5. PID入门的十五个基本概念
  6. Python数值类型:小数与百分数的转换
  7. 为什么又要造一个叫 Latke 的轮子
  8. UESTC_秋实大哥与快餐店 2015 UESTC Training for Data StructuresProblem C
  9. 百度AI 17篇 CVPR 2019 论文介绍(附下载)
  10. 计算机桌面图标有箭头,电脑桌面图标为什么会有一个小箭头,原来没的呀,
  11. Shared library can't open object
  12. AES、DES加解密方法(Java和JS编程)
  13. D2 日报 2019年6月5日
  14. 快速将视频分解成一帧帧的图片
  15. 【搜索】桐桐的运输方案
  16. ssm毕设项目iGame游戏交易平台nzln3(java+VUE+Mybatis+Maven+Mysql+sprnig)
  17. igraph基本用法
  18. Kotlin第二章:kotlin基础
  19. 机器视觉、模式识别库
  20. win7 IE64位浏览器能上网,ie,搜狗等不能上网 的解决办法

热门文章

  1. Java异常处理基础
  2. Java的不同版本:J2SE、J2EE、J2ME的区别
  3. 【译】Secure Computations as Dataflow Programs Implementing the SPDZ Protocol using TensorFlow
  4. Android安全系列工具
  5. 两步搞定Hyperledger主打区块链解决方案Fabric
  6. python len ljust_Python string.ljust方法代码示例
  7. android倒计时录制视频下载,android录制视屏(预览,倒计时)
  8. 页面放在哪_seo页面怎么优化?seo页面优化有哪些方法?
  9. 安装完matlab7.0但无法运行
  10. 战争游戏[tarjan]