常見的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