文档章节

java调用python脚本

o
 osc_mervd488
发布于 2018/04/22 21:51
字数 813
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

常见的java调用python脚本方式

  • 通过jython.jar提供的类库实现 (不建议使用,因为会报module没有找到的错误,总之就是很蛋疼,要设置一系列的参数)
  • 通过Runtime.getRuntime()开启进程来执行脚本文件(建议使用,原因:简单粗暴我喜欢!!!)在这个里面注意:调用py脚本的时候,先用windows的dos界面去运行下 命令: python xxxx.py,测试,脚本可以调用,不然可能在java脚本就是调用了,但是就是失败了的情况,导致一直卡住,本人就是这样的一个情况。卡了两天。。。。。。

通过jython.jar提供的类库实现

通过jython.jar实现的话,我们需要引入jar包,具体我写了一个demo,假设你的python代码为test.py:

def my_test(name, age):
    print("name: "+name)
    print("age: "+age)
    return "success"
  • 1
  • 2
  • 3
  • 4

java调用test.py代码:

public static void main(String[] args) {
      PythonInterpreter interpreter = new PythonInterpreter();  
      interpreter.execfile("E:\\workspace\\pycharm_workspace\\weixincrawer\\test.py");  
      PyFunction function = (PyFunction)interpreter.get("my_test",PyFunction.class);  
      PyObject pyobject = function.__call__(new PyString("huzhiwei"),new PyString("25")); 
      System.out.println("anwser = " + pyobject.toString());  
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果:

name: huzhiwei
age: 25
anwser = success
  • 1
  • 2
  • 3

到此是没有什么问题的,我们使用function.call方法传入参数调用python函数,使用pyobject.toString()方法拿到python中my_test函数的返回值,但是如果你把test.py稍微做下修改如下:

import requests

def my_test(name, age):
    response = requests.get("http://www.baidu.com")
    print("name: "+name)
    print("age: "+age)
    return "success"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

不修改java调用代码的情况下,你会得到下面异常信息:

ImportError: No module named requests
  • 1

没错,这就是我要讨论的问题,因为jython不可能涵盖所有python第三方类库的东西,所以在我们得python文件中用到requests类库的时候,很显然会报找不到模块的错误,这个时候我们是可以通过Runtime.getRuntime()开启进程来执行python脚本文件的。

通过Runtime.getRuntime()开启进程来执行脚本文件

使用这种方式需要同时修改python文件以及java调用代码,在此我同样在上面test.py的基础上进行修改:

import requests
import sys

def my_test(name, age):
    response = requests.get("http://www.baidu.com")
    print("url:"+response.url)
    print("name: "+name)
    print("age: "+age)
    return "success"

my_test(sys.argv[1], sys.argv[2])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

和上面test.py代码最大的区别在于,我们此处开启进程的方式实际上是在隐形的调用dos界面进行操作,因此在python代码中我们需要通过sys.argv的方式来拿到java代码中传递过来的参数。

java调用代码部分:

public static void main(String[] args) {
      String[] arguments = new String[] {"python", "E:\\workspace\\pycharm_workspace\\weixincrawer\\test.py", "huzhiwei", "25"};
        try {
            Process process = Runtime.getRuntime().exec(arguments);
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;  
          while ((line = in.readLine()) != null) {  
              System.out.println(line);  
          }  
          in.close();  
          int re = process.waitFor();  
          System.out.println(re);
        } catch (Exception e) {
            e.printStackTrace();
        }  
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

结果输出:

url:http://www.baidu.com/
name: huzhiwei
age: 25
0
  • 1
  • 2
  • 3
  • 4

在此需要注意的一点,java代码中的process.waitFor()返回值为0表示我们调用python脚本成功,返回值为1表示调用python脚本失败,这和我们通常意义上见到的0与1定义正好相反。



转载自:https://blog.csdn.net/hzw19920329/article/details/77509497

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

linux下java环境搭建

1、jdk下载: 官方地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 如下图所示,我这边选择的是红框中的版本 2、压缩包上传至服务器 将下载的压缩包上传...

wc_飞豆
19分钟前
17
0
面试题:Java对象不再使用时,为什么要赋值为null?

前言 许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话,而且好多开发者一直信奉着这句话;问其原因,大都是回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回...

码农突围
21分钟前
11
0
设计模式(5) 原型模式

原型模式 原型模式的适用场景 浅拷贝 深拷贝 用Initialize方法修改初始化状态 原型模式与之前学习的各种工厂方法、单例模式、建造者模式最大、最直观的区别在于,它是从一个既有的对象“克隆...

zhixin9001
21分钟前
7
0
获取免费的pycharm激活码网站

http://www.lookdiv.com/

云烟成雨forever
21分钟前
27
0
用Helm部署Kubernetes应用,支持多环境部署与版本回滚

1 前言 Helm是优秀的基于Kubernetes的包管理器。利用Helm,可以快速安装常用的Kubernetes应用,可以针对同一个应用快速部署多套环境,还可以实现运维人员与开发人员的职责分离。现在让我们安...

南瓜慢说
22分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部