有时候在java项目里,需要执行Python脚本以下几种方式:

1、直接执行Python脚本代码
引用 org.python包 创建一个 python解释器,貌似这种方式不可以导入第三方库,模块。。。 PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); "); ///执行python脚本12 2 、执行python .py文件
PythonInterpreter interpreter = new PythonInterpreter();
InputStream filepy = new FileInputStream("D:\\demo.py");
interpreter.execfile(filepy); ///执行python py文件
filepy.close();1234 3、使用Runtime.getRuntime()执行脚本文件
这种方式和.net下面调用cmd执行命令的方式类似。如果执行的python脚本有引用第三方包的,建议使用此种方式。使用上面两种方式会报错java ImportError: No module named arcpy。 Process proc = Runtime.getRuntime().exec("python D:\\demo.py");
proc.waitFor();

项目webservice RESTful 风格 采用 sprintboot + jetty 内置容器打包 jar 方式运行 (持久层整合 mybatis)

因为当前公司项目我要负责编写 webservice 部分代码,而我们后台是采用 python 做 AI model,所以,避免不了要java与python交互传递数据,此外客户要求直接返回数据

仓促博客记录代码如下

定义调用python service 接口

public interface JPythonService {
String callPythonScript(String pyFile,String params)throws Exception;
}

接口实现类


import com.middleplugin.exception.CustomException;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ConcurrentHashMap;
import com.middleplugin.service.JPythonService;
import com.middleplugin.utils.DBUtil;
import org.springframework.stereotype.Service;
import org.apache.log4j.Logger;
@Service
public class JPythonServiceImpl implements JPythonService{
private Logger logger = Logger.getLogger(JPythonServiceImpl.class);
@Override
public String callPythonScript(String pyFile,String params) throws IOException{
Process process = null;
try{
String[] command = new String[]{"sh", "-c","/home2/xxx/anaconda/envs/py35/bin/python "+pyFile+" '"+params+"'"};
process = Runtime.getRuntime().exec(command);
for(String s:command){
System.out.print(s);
}
for(int i=0;i<=3;i++) {
System.out.println();
} }
catch(IOException e){
// e.printStackTrace(); logger.error(e);
throw e;
}
StringBuffer stringBuffer = new StringBuffer();
InputStream stdIns = process.getInputStream();
InputStream stdErrorIns= process.getErrorStream(); BufferedInputStream stdInput = new BufferedInputStream(stdIns);
BufferedInputStream stdError = new BufferedInputStream(stdErrorIns); ConcurrentHashMap<String,String> concurrentHashMap = new ConcurrentHashMap<String,String>(); new Thread(){//读取标准输入流
@Override
public void run() {
int bytesRead = 0;
byte[] buffer=new byte[1024];
try {
while ((bytesRead = stdInput.read(buffer)) != -1) {
String chunk = new String(buffer,0,bytesRead);
stringBuffer.append(chunk);
concurrentHashMap.put("stdInput",chunk);
System.out.println("result: "+stringBuffer.toString());
}
}
catch(IOException ioe){
ioe.printStackTrace();
}
finally{
if(stdInput!=null){
try{stdInput.close();}
catch(IOException ioe){
ioe.printStackTrace();
}}
}
}
}.start(); new Thread(){//读取标准错误流
@Override
public void run() {
int bytesRead = 0;
byte[] buffer=new byte[1024];
try {
while ((bytesRead = stdError.read(buffer)) != -1) {
String chunk = new String(buffer,0,bytesRead);
stringBuffer.append(chunk);
concurrentHashMap.put("stdError",chunk);
System.out.println("result: "+stringBuffer.toString());
}
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
}.start(); try {
process.waitFor();
process.destroy();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (concurrentHashMap.get("stdError")!=null){
throw new CustomException("python 脚本有问题!");
// DBUtil.insert_log();
}
return concurrentHashMap.get("stdInput");
}
}

controller 层调用

@Autowired
private JPythonService jPythonService; @RequestMapping("/mtb/pyml")
public JSONObject mtbML(@RequestBody JSONObject params){
TriggerTaskServiceForMTBImpl triggerTaskServiceForMTB = new TriggerTaskServiceForMTBImpl();
JSONObject retJson = new JSONObject();
String errorMessage = "success";
Integer state = 200;
String result = null;
String treatmentRankingPyFile = config.getString("treatmentranking.file");
try{ result = jPythonService.callPythonScript(treatmentRankingPyFile,params.toString());
}
catch(Exception e){
errorMessage = e+" failed";
state = 500;
System.out.println("running ml script failed!");
}
retJson.put("errorMessage",errorMessage);
retJson.put("state",state);
retJson.put("result",result);
return retJson;
}

java 调用 python 脚本的更多相关文章

  1. java调用python脚本并向python脚本传递参数

    1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...

  2. (转)java调用python脚本

    这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...

  3. 通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

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

    Java调用Python的的两种方式 1.Runtime private static String call_python(String input_argv) { String python_py ...

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

    在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在 ...

  6. Java调用Python脚本

    今天遇到Java调用一个Python脚本的问题,纠结了大半天,遇到各种问题.网上搜索的大部分都是用jython,但是我想要调用的python脚本里有import urllib,这个urllib也不是什 ...

  7. Java调用Python脚本工具类

    [本文出自天外归云的博客园] 在网上查了很多方法都不成功,在google上搜到一篇文章,做了一些小修改,能够处理中文输出.提取一个运行python脚本的Java工具类如下: package com.a ...

  8. Java 调用python说明文档

    Java 调用python说明文档 通过java调用python脚本主要如下三种方式: 1.直接执行python脚本: 2.执行python.py文件: 3.使用Runtime.getRuntime( ...

  9. java中怎么调用python 脚本

    调用方法: import java.io.BufferedReader; import java.io.InputStreamReader; public class PythonInvoke { p ...

随机推荐

  1. 微信小程序Dom事件实现

    面对微信小程序,可能没有像我们平时使用JQuery那样随心所欲.本篇就是为了解决这个问题. 请合理使用工具! 细节就不说了,直接备份一个实现的案例: wxml <view class=" ...

  2. power designer 一般常用快捷键(转)

    一般快捷键 快捷键 说明 F4 打开检查模型窗口,检查模型 F5 如果图窗口内的图改变过大小,恢复为原有大小即正常大小 F6 放大图窗口内的图 F7 缩小图窗口内的图 F8 在图窗口内中查看全部图内容 ...

  3. QML 用QSortFilterProxyModel实现搜索功能

    搞了一晚上终于实现了,写个博客纪念一下吧. c++部分的代码: #include <QQmlApplicationEngine> #include <QQmlContext> ...

  4. Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)

    题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...

  5. Mysql连接报错:1130 - Host ‘118.111.111.111’ is not allowed to connect to this MariaDB server

    这个问题是因为在数据库服务器中的mysql数据库中的user的表中没有权限(也可以说没有用户),下面将记录我遇到问题的过程及解决的方法. 在搭建完LNMP环境后用Navicate连接出错 遇到这个问题 ...

  6. PHP基础学习----函数

    一.函数的定义 function 函数名([参数1,参数2,参数3,...]){ 函数体: [return 返回值;] } //函数调用 函数名([参数1,参数2,参数3,...]): 二.可变函数 ...

  7. Spring Boot 日志配置方法(超详细)

    默认日志 Logback : 默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台.在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了. 从上图 ...

  8. poj1442 Black Box

    The Black Case 好啊! 首先,读题很艰难... 读完题,发现是求第k小的数,那么我们用splay水过对顶堆水过即可. #include <cstdio> #include & ...

  9. TCHAR和CHAR类型的互转,string 转lpcwstr

    https://www.cnblogs.com/yuguangyuan/p/5955959.html 没有定义UNICODE,所以它里面的字符串就是简单用" "就行了,创建工程的时 ...

  10. 11款插件让你的Chrome成为全世界最好用的浏览器|Chrome插件推荐

    文章来源:知乎 收录于:风云社区(SCOEE)[提供mac软件下载] 更多专题,可关注小编[磨人的小妖精],查看我的文章,也可上[风云社区 SCOEE],查找和下载相关软件资源. (一)综合类: 新买 ...