目录
近期正在自制一个APP,里边需要用到python爬取一些信息,同时也是为了实践和巩固自己学到的知识点。而且我发现网上写java和python整合的文章比较少。所以就打算写一篇文章来给袍泽们做一个借鉴。
三、解释Process proc = Runtime.getRuntime().exec(args);含义
前言
近期正在自制一个APP,里边需要用到python爬取一些信息,同时也是为了实践和巩固自己学到的知识点。而且我发现网上写java和python整合的文章比较少。所以就打算写一篇文章来给袍泽们做一个借鉴。
一、先自己准备一个搭建好的java项目
我这里是直接用了spring框架然后tomcat+mysql搭建的
二、java调用python全部代码
java代码如下:
@PostMapping("/searchMusic")
public Object searchMusic(@RequestParam("musicName") String musicName, @RequestParam("musicNumber") String musicNumber, @RequestParam("firstMusicNumber") String firstMusicNumber) throws IOException, InterruptedException {
StringBuilder stringBuilder = new StringBuilder();
System.out.println("总共" + musicNumber + "条数据");
try {
if (!StringUtils.hasLength(musicName)) {
return stringBuilder;
}
//获取当前项目的路径
StringBuilder pythonUrl = new StringBuilder();
pythonUrl.append("/usr/softward/python/Python-3.8.1/pythonProject/getMusic.py");
String[] args = new String[]{"python3", pythonUrl.toString(), musicName, musicNumber, firstMusicNumber};
Process proc = Runtime.getRuntime().exec(args);// 执行py文件
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(), "GBK"));
stringBuilder.append(in.readLine());
//java代码中的process.waitFor()返回值为0表示我们调用python脚本成功,
System.out.println(proc.waitFor() == 0 ? "python脚本执行成功" : "python脚本执行失败");
in.close();
proc.waitFor();
Runtime.getRuntime().gc();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(stringBuilder.toString());
return stringBuilder;
}
我这里的项目是放在阿里云ECS服务器上边的这边这个路径写绝对路径就行了。
这里我们采用java中
Runtime.getRuntime().exec(args)
在linux中单独开启一个进程,来执行python脚本。这个方法在windows上也是可行的。
其中args这个数组里边的python3是你在进入python中的命令,比如:
在window中打开cmd命令窗口。输入python会显示已经进去python运行环境中,然后还会显示一个版本号。因为我电脑上只安装了一个3.8版本的python所以我直接就配置了”python“作为进入python运行环境的命令。所以我这里输入”python3“是会显示找不到命令的。
这里先来看下windows下的idea控制台输出的日志:
但是阿里云服务器上是默认安装了几个python版本的,我们来看看吧。
这里蓝色的文件是linux中的”软链接“,命令中输入软链接名称就会打开对应的文件,跟”别称“差不多。
现在可以看到输入不同命令进入到的是不同的python版本运行环境中。
三、解释Process proc = Runtime.getRuntime().exec(args);含义
String[] args = new String[]{"python", pythonUrl.toString(), musicName, musicNumber, firstMusicNumber};
Process proc = Runtime.getRuntime().exec(args);// 执行py文件
Runtime.getRuntime().exec(args)这里相当于你输入命令,比如:
python /usr/HelloWorld.py 或者
python D://HelloWorld.py
这里不管是linux还是windows都是一样的。
我这里直接放的是数组。要注意的是数组中的元素顺序必须跟你直接敲命令行的顺序是一样的。
然后后面的musicName, musicNumber, firstMusicNumber这里是我python中方法的参数。
下面来看看python中代码是怎么写的吧。
四、python全部代码
# -*- coding: utf-8 -*-
import sys
from nian import *
def func(name,number,firstNumber):
iarray=[];
number=int(number)
firstNumber=int(firstNumber)
if not niankw(name) is None :
niankwArray=[niankw(name),name];
iarray.append(niankwArray);
for i in range(firstNumber,number):
if nianqq(name,i,True)[0] !="https://isure.stream.qqmusic.qq.com/":
iarray.append(nianqq(name,i,True))
return iarray;
if __name__ == '__main__':
a = []
for i in range(1, len(sys.argv)):
a.append((str(sys.argv[i])))
print(func(a[0],a[1],a[2]))
这里直接就是一个python文件,你python是怎么写的这里就是怎么写的。java只是帮你调用了一下这个python文件而已。省去了你敲python命令行的步骤。
我这里在python中的main方法中循环了一下系统参数,也就是"sys.argv"这个数组,这个数组是java那边通过Runtime.getRuntime().exec(args)传过来的。
到这里我想你肯定明白java是怎么调用python脚本的了吧!至于底层怎么实现的话可以去看下Runtime.getRuntime().exec(args)这个方法是怎么实现的。下面展示一下运行后的结果。我这里用的是postman调用接口。
没有安装接口测试工具的小伙伴,可以将java代码中controller层中的
@PostMapping("/searchMusic")
改成
@GetMapping("/searchMusic")
就可以在浏览器中url中调用啦
总结
以上就是java怎么调用python的步骤啦。后续还会持续更新有关各种程序代码的内容哦,请点击关注收藏,各种知识可不能错过哦!