Java 專案呼叫python 專案的解決方案
阿新 • • 發佈:2019-08-01
在實際開發中,可能會遇到需要java專案呼叫python專案的情況,因為兩種語言各有優點.目前通過java呼叫python的方法有以下幾種
- 通過 Runtime來實現, 通過Runtime來呼叫py檔案,python程式輸出儲存在字元流中,通過讀取字元流來解析結果
public static void main(String[] args) throws IOException, InterruptedException { String exe = "python"; String command = "D:\\calculator_simple.py"; String num1 = "1"; String num2 = "2"; String[] cmdArr = new String[] {exe, command, num1, num2}; Process process = Runtime.getRuntime().exec(cmdArr); InputStream is = process.getInputStream(); DataInputStream dis = new DataInputStream(is); String str = dis.readLine(); process.waitFor(); System.out.println(str); }
- 通過java 第三方包Jython來呼叫py,這種方法我沒試過,因為我去Jython官網看了下, Jython更新停止在2015年,版本是:Jython 2.7.0 Final Released (May 2015),非常的可怕,這代表這個專案已近沒人維護了,所以我直接放棄......
- 通過http服務的方式呼叫
- python端使用Flask 工具包
from flask import Flask from flask import request import json
app = Flask(__name__)
@app.route('/analysisData', methods=['GET', 'POST']) def analysis_data(): call_back = '{"boxId:"00000007", "failureRate":"0.8", "failureType":"1", "failureTime":"2019-08-01 12:00:00"}' return call_back if __name__ == '__main__': app.run(host='0.0.0.0')
通過 app.run()來啟動一個http服務, ps: run()不帶引數預設是本機127.0.0.1,也就是隻有本機本訪問,host='0.0.0.0'使其他機器也能訪問.
- java端, 我們使用feign/openfeign(spring cloud後面的版本feign更名為openfeign)
<!--Spring cloud feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.2.RELEASE</version> </dependency>
編寫feign介面
/** * @author: liaofuxing * @E-mail: [email protected] * @date: 2019/07/26 11:19 **/ @FeignClient(url = "http://192.168.31.179:5000", name = "pythonClient") public interface PythonClient { @RequestMapping(value = "/analysisData",method= RequestMethod.POST, consumes="application/json") String pythonAnalysisData(ZdEntity zdEntity); }
@FeignClient 的url 屬性是需要呼叫的python端的ip和埠
在啟動類上加入Feign註解 @EnableFeignClients
@SpringBootApplication @MapperScan("com.elevatorproject.quartzplatform.*.mapper") @EnableFeignClients public class QuartzplatformApplication { public static void main(String[] args) { SpringApplication.run(QuartzplatformApplication.class, args); } }
這樣feign/openfeign就簡單的配置好了,然後在需要的地方直接注入feign的介面就行了
@Autowired private PythonClient pythonClient;
java和python兩端用json的方式互相傳引數,python端用params = request.get_json()可以取到java feign介面傳過來的引數.
params = request.get_json()
這樣一個簡單的呼叫就完成了.
總結:3種方式各有優缺點,
第1種,通過runtime的方式呼叫看似最簡單,但是python的輸出結果到字元流中,解析字元流很難受,特別是輸出很多時,而且python端也不容易維護.
第2種,Jython這專案已近太久沒更新了直接放棄,如果你不怕死的話,可以試試...........
第3種,http的方式,我個人是最推薦的,如果python端原本就要做服務的話,其實http呼叫是最直觀的,java和python共同構成異構專案用json互動,也非常符合現在微服務的理念,而且python端可維護性較高,引數傳遞變的非常簡單.
以上如果你有一個好老闆,你說啟動一個python http服務他說沒錢買伺服器部署,太重了. 以