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]及以后各项:是接收的参数