Java 调用python说明文档

Java 调用python说明文档

通过java调用python脚本主要如下三种方式:

1、直接执行python脚本;

2、执行python.py文件;

3、使用Runtime.getRuntime()执行脚本文件;

前两种是引入Jython调用pythoninterpreter的类内嵌的编译器,但是如果调用python的某些扩展库,会出错,机器学习的库用此种方式调用,暂未找到解决办法(请教大家),----------也许是因为numpy的缘故吧。

第三种方式也是很简单的一种调用方式。采用java调用控制台进程,即Runtime.getRuntime().exec(),来运行这个python脚本。下面简单介绍此种方式用到的知识。

一、有关process

process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序)。

process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。

processBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 process 子类的一个实例,该实例可用来控制进程并获取相关信息。

创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。

二、如何创建Process对象,一般有一下两种方法

1)每个 ProcessBuilder 实例管理一个进程属性集。start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。

2)Runtime.exec() 方法创建一个本机进程,并返回 Process 子类的一个实例。

三、代码演示

Java核心代码:

1 Process proc=Runtime.getRuntime().exec(args1); //执行py文件
2
3
4 InputStreamReader stdin=new InputStreamReader(proc.getInputStream());
5
6 //构造一个默认编码集的InputStreamReader类
7
8 LineNumberReader input=new LineNumberReader(stdin);//用来按行读取文本文件

其中args1是String[] { "python",path,url1,url2}; ,path是python文件所在路径,url1是参数1,url2是参数2。

Python代码:

其中sys.argv用于获取参数url1,url2等。

sys.argv[0]:是python脚本名

sys.arg[1]及以后各项:是接收的参数

时间: 2024-10-12 15:34:20

Java 调用python说明文档的相关文章

(转)java调用python脚本

这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用到第三方类库的情况. 先来说说我为什么要用java调用python代码,原因就在于python在爬虫方面提供了丰富的类库,但我本来已经有一套java操作数据库以及消息中间件的代码,这些代码用python实现的话可能需要至少一周时间,为了减少时间成本,因此我决定用java调用python脚本的方式使用

[Java/Python] java调用python脚本问题记录

Java调用Python的的两种方式 1.Runtime private static String call_python(String input_argv) { String python_py = "C:/Users/lichaoxing/Desktop/python_test.py"; String result = null; try { String[] args1 = new String[] { "python", python_py, input

java调用python的惨痛史(无法获取环境变量)

环境:java,was,python2.6,红帽linux,oracle,python用cx_Oracle        事情是这样的,有个需求,需要对数据库进行处理,简单说就是把数据取出来,用python使用外部传参做一个处理,再写回到数据库.如果使用java直接搞的话需要绕很大一个圈,比较麻烦,用python的话就很简单了,于是就有了下面的故事,希望和我遇到同样问题的同学能对你们有一些帮助,少绕一些圈子,java和python功能开发都很顺利,于是到了java调用python环节 大概把需要

java调用python脚本

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

在eclipse中用java调用python报错 Exception in thread "main" ImportError: Cannot import site module and its dependencies

最近做项目需要用java调用python,配置了jython后,运行了例子代码: 获得一个元组里面的元素: import org.python.util.PythonInterpreter; public class FirstJavaScript { public static void main(String args[]) { PythonInterpreter interpreter = new PythonInterpreter(); interpreter.exec("days=('

使用java调用python训练出的pmml模型

作为一个2,3年没有用过java的数据挖掘工程师,突然要用java来调用pmml模型,真的好烦啊. 在网上找了一段代码,自己试了1个礼拜才运行成功,记录下自己的过程,以后可以随时用,如果能帮到大家就更好了. 从安装软件说起,嫌麻烦的就别看了. 一.下载工具(俗话说得好,预先善其事必先利其器!哈哈) 我刚开始安装的是eclipse,但有诸多麻烦不能解决,就用了IDEA,和Pycharm一个公司发行的. 首先进入官网: http://www.jetbrains.com/products.html#l

Java调用Python遇到的一系列问题与解决方案

首先,百度了几个方法 1.用jython里的一个jar包,jython.jar,里面封装了一个专门调用Python的类, 但是不知道为什么我用Java一调用就报错,因此放弃. 2.用runtime.getRuntime().exec('python filename')进程来执行Python文件, 但是由于自己电脑既安装了Python2又安装了Python3,且Python2为默认调用, 因此runtime执行时默认用Python2运行,而我又是用Python3写的代码,因此又行不通 3.由于在

Java调用Python程序

最近,需要在应用中,需要使用Java程序去调用Python代码,主要有两种实现方式. 一.使用Jython架包 因为调用的Python代码中需要使用Json对象,开始使用jython2.5.2,发现不支持json.因此, 升级了最新的Jython2.7.0,发现可以支持.因此,要使用更多python库,建议使用更高版本的Jython包. 首先,添加Jython的Maven依赖: 其后,写了一个简单的测试程序: 其后,可以得到如下结果: 二.使用Runtime.getRuntime()执行脚本文件

Java调用Python脚本并获取返回值

在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在这种情况下可以采用另一种方法:使用Java的Runtime,像在命令行直接调用python脚本那样调用python程序.此时可以通过文件作为脚本参数来传递Python程序所需要的参数,并从脚本的输入输出流来获取本来该打印在控制台的结果. 先准备好一个python文件: def get_path(fi