1. 程式人生 > >Java 專案呼叫python 專案的解決方案

Java 專案呼叫python 專案的解決方案

在實際開發中,可能會遇到需要java專案呼叫python專案的情況,因為兩種語言各有優點.目前通過java呼叫python的方法有以下幾種

  1. 通過 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);
            }
  2. 通過java 第三方包Jython來呼叫py,這種方法我沒試過,因為我去Jython官網看了下, Jython更新停止在2015年,版本是:Jython 2.7.0 Final Released (May 2015),非常的可怕,這代表這個專案已近沒人維護了,所以我直接放棄......
  3. 通過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服務他說沒錢買伺服器部署,太重了. 以