java調用python腳本


常見的java調用python腳本方式

  • 通過jython.jar提供的類庫實現 (不建議使用,因為會報module沒有找到的錯誤,總之就是很蛋疼,要設置一系列的參數)
  • 通過Runtime.getRuntime()開啟進程來執行腳本文件(建議使用,原因:簡單粗暴我喜歡!!!)在這個里面注意:調用py腳本的時候,先用windows的dos界面去運行下 命令: python xxxx.py,測試,腳本可以調用,不然可能在java腳本就是調用了,但是就是失敗了的情況,導致一直卡住,本人就是這樣的一個情況。卡了兩天。。。。。。

通過jython.jar提供的類庫實現

通過jython.jar實現的話,我們需要引入jar包,具體我寫了一個demo,假設你的python代碼為test.py:

def my_test(name, age):
    print("name: "+name)
    print("age: "+age)
    return "success"
  • 1
  • 2
  • 3
  • 4

java調用test.py代碼:

public static void main(String[] args) {
      PythonInterpreter interpreter = new PythonInterpreter();  
      interpreter.execfile("E:\\workspace\\pycharm_workspace\\weixincrawer\\test.py");  
      PyFunction function = (PyFunction)interpreter.get("my_test",PyFunction.class);  
      PyObject pyobject = function.__call__(new PyString("huzhiwei"),new PyString("25")); 
      System.out.println("anwser = " + pyobject.toString());  
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

輸出結果:

name: huzhiwei
age: 25
anwser = success
  • 1
  • 2
  • 3

到此是沒有什么問題的,我們使用function.call方法傳入參數調用python函數,使用pyobject.toString()方法拿到python中my_test函數的返回值,但是如果你把test.py稍微做下修改如下:

import requests

def my_test(name, age):
    response = requests.get("http://www.baidu.com")
    print("name: "+name)
    print("age: "+age)
    return "success"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

不修改java調用代碼的情況下,你會得到下面異常信息:

ImportError: No module named requests
  • 1

沒錯,這就是我要討論的問題,因為jython不可能涵蓋所有python第三方類庫的東西,所以在我們得python文件中用到requests類庫的時候,很顯然會報找不到模塊的錯誤,這個時候我們是可以通過Runtime.getRuntime()開啟進程來執行python腳本文件的。

通過Runtime.getRuntime()開啟進程來執行腳本文件

使用這種方式需要同時修改python文件以及java調用代碼,在此我同樣在上面test.py的基礎上進行修改:

import requests
import sys

def my_test(name, age):
    response = requests.get("http://www.baidu.com")
    print("url:"+response.url)
    print("name: "+name)
    print("age: "+age)
    return "success"

my_test(sys.argv[1], sys.argv[2])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

和上面test.py代碼最大的區別在於,我們此處開啟進程的方式實際上是在隱形的調用dos界面進行操作,因此在python代碼中我們需要通過sys.argv的方式來拿到java代碼中傳遞過來的參數。

java調用代碼部分:

public static void main(String[] args) {
      String[] arguments = new String[] {"python", "E:\\workspace\\pycharm_workspace\\weixincrawer\\test.py", "huzhiwei", "25"};
        try {
            Process process = Runtime.getRuntime().exec(arguments);
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;  
          while ((line = in.readLine()) != null) {  
              System.out.println(line);  
          }  
          in.close();  
          int re = process.waitFor();  
          System.out.println(re);
        } catch (Exception e) {
            e.printStackTrace();
        }  
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

結果輸出:

url:http://www.baidu.com/
name: huzhiwei
age: 25
0
  • 1
  • 2
  • 3
  • 4

在此需要注意的一點,java代碼中的process.waitFor()返回值為0表示我們調用python腳本成功,返回值為1表示調用python腳本失敗,這和我們通常意義上見到的0與1定義正好相反。



轉載自:https://blog.csdn.net/hzw19920329/article/details/77509497


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM