設為首頁收藏本站

艾歐踢論壇

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 615|回復: 0
打印 上一主題 下一主題

java呼叫python的幾種用法

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2022-3-6 20:45:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
java呼叫python的幾種用法如下:
  • 在java類中直接執行python語句
  • 在java類中直接呼叫本地python指令碼
  • 使用Runtime.getRuntime()執行python指令碼檔案(推薦)
  • 呼叫python指令碼中的函式
準備工作:建立maven工程,結構如下:


到官網https://www.jython.org/download.html下載Jython的jar包
或者在maven的pom.xml檔案中加入如下程式碼:
(Jython is a Java implementation of Python, developed to run in Java platforms and use Java classes. The name itself is a tell: Jython=Java+Python.)

  1. <dependency>

  2.           <groupId>org.python</groupId>

  3.           <artifactId>jython-standalone</artifactId>

  4.           <version>2.7.0</version>

  5.         </dependency>
複製代碼

1.在java類中直接執行python語句建立JavaRunPython.java類:

  1.         package com.test;

  2.         import org.python.util.PythonInterpreter;

  3.         public class JavaRunPython {
  4.           public static void main(String[] args) {
  5.             PythonInterpreter interpreter = new PythonInterpreter();
  6.             interpreter.exec("a='hello world'; ");
  7.             interpreter.exec("print a;");
  8.     }
  9. }
複製代碼
輸出結果如下:

出現的console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0.並不是錯誤,而是相容所導致,解決方法如下:
2.在java中直接呼叫python指令碼在本地的D盤建立一個python指令碼,檔名字為javaPythonFile.py,檔案內容如下:

  1.         a = 1
  2.         b = 2
  3.         print (a + b)
複製代碼
建立JavaPythonFile.java類,內容如下:

  1.         package com.test;
  2.          
  3.         import org.python.util.PythonInterpreter;
  4.          
  5.         public class JavaPythonFile {
  6.          
  7.           public static void main(String[] args) {
  8.             PythonInterpreter interpreter = new PythonInterpreter();
  9.             interpreter.execfile("D:\\javaPythonFile.py");
  10.     }
  11.         }
複製代碼
輸出結果如下:

3.使用Runtime.getRuntime()執行python指令碼檔案,推薦使用在本地的D盤建立一個python指令碼,檔名字為Runtime.py,檔案內容如下:
  1. print('RuntimeDemo')
複製代碼
建立RuntimeFunction.java類,內容如下:

  1.         package com.test;
  2.          
  3.         import java.io.BufferedReader;
  4.         import java.io.IOException;
  5.         import java.io.InputStreamReader;
  6.          
  7.         public class RuntimeFunction {
  8.           public static void main(String[] args) {
  9.             Process proc;
  10.             try {
  11.               proc = Runtime.getRuntime().exec("python D:\\Runtime.py");
  12.               BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
  13.               String line = null;
  14.               while ((line = in.readLine()) != null) {
  15.                 System.out.println(line);
  16.               }
  17.               in.close();
  18.               proc.waitFor();
  19.             } catch (IOException e) {
  20.               e.printStackTrace();
  21.             } catch (InterruptedException e) {
  22.               e.printStackTrace();
  23.             }
  24.           }
  25.         }
複製代碼
執行結果如下:

4.呼叫python指令碼中的函式在本地的D盤建立一個python指令碼,檔名字為add.py,檔案內容如下:

  1.         def add(a,b):
  2.           return a + b
複製代碼
建立Function.java類,內容如下:

  1.         package com.test;
  2.          
  3.         import org.python.core.PyFunction;
  4.         import org.python.core.PyInteger;
  5.         import org.python.core.PyObject;
  6.         import org.python.util.PythonInterpreter;
  7.          
  8.         public class Function {
  9.            
  10.           public static void main(String[] args) {
  11. 11
  12.             PythonInterpreter interpreter = new PythonInterpreter();
  13.             interpreter.execfile("D:\\add.py");
  14.                  
  15.             // 第一個引數為期望獲得的函式(變數)的名字,第二個引數為期望返回的物件型別
  16.             PyFunction pyFunction = interpreter.get("add",PyFunction.class);
  17.             int a = 5,b = 10;
  18.             //呼叫函式,如果函式需要引數,在Java中必須先將引數轉化為對應的“Python型別”
  19.             PyObject pyobj = pyFunction.__call__(new PyInteger(a),new PyInteger(b));
  20.             System.out.println("the anwser is: " + pyobj);
  21.           }
  22.          
  23.         }
複製代碼


執行結果如下:



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 分享淘帖
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|手機版|艾歐踢創新工坊    

GMT+8, 2024-5-17 02:11 , Processed in 0.275158 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表