Jython:java調用python文件之第三方包路徑問題

本文轉載自:http://blog.csdn.net/ztf312/article/details/51338060java

本方法解決python代碼的可移植性,不須要在新機器上配置python環境,只經過安裝jython的方式將python代碼嵌入java工程python

1. Jython如何安裝app

下載地址:jython_installer-2.5.0.jar  。下載須要積分,若是無積分,可聯繫樓主。eclipse

傻瓜式下一步安裝方式,路徑最好和工程選在同一目錄下。spa

2. 運行python代碼.net

舉個簡單例子,安裝好java環境及eclipse以後,copy以下代碼便可運行。註釋部分爲運行文件的方式,須要新建文件後去掉註釋執行。code

import java.io.IOException; import org.python.util.PythonInterpreter; public class test { public static void main(String args[]) throws IOException { PythonInterpreter interpreter = new PythonInterpreter(); // 運行python語句 
        interpreter.exec("a = \"hello, Jython\""); interpreter.exec("print a"); // 執行python文件 // interpreter.exec("filepy = \"E:\\test.py\""); // interpreter.execfile(filepy); ///執行python py文件 // filepy.close(); 
 } }

3. 處理第三方包server

 

在文件運行方式中,blog

第一種狀況:若是.py文件中包含同一目錄的自定義包,則在eclipse工程下可正常調用。ip

第二種狀況:若是包含第三方包,須要拷貝到當前目錄下。

第三種狀況:因爲路徑問題沒法調用。Jython/lib文件下有大量第三方包,如os, re, __future__,重複拷貝費時費力,這時可手動修改path路徑。(推薦)

修改路徑有兩種方式:

(1) Java方式

import org.python.core.Py; import org.python.core.PySystemState; System.out.println(sys.path.toString()); // previous 
PySystemState sys = Py.getSystemState(); sys.path.add("E:\\sacaapm-paserver\\src-python\\jython\\Lib"); System.out.println(sys.path.toString()); // later 

將代碼嵌入part 2代碼,獲得完整代碼後執行,能夠看到先後路徑發生變化。

(2) python方式

interpreter.exec("import sys"); interpreter.exec("print sys.path");

(3) 靈活運用以上兩種方式或其組合形式。

當import sys時報出「sys模塊不存在」的錯誤,建議使用第一種。

完整代碼以下:

import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.python.core.Py; import org.python.core.PySystemState; import org.python.util.PythonInterpreter; public class test { public static void main(String args[]) throws IOException { PythonInterpreter interpreter = new PythonInterpreter(); PySystemState sys = Py.getSystemState(); sys.path.add("E:\\src-python\\jython\\Lib"); interpreter.exec("import sys"); interpreter.exec("print sys.path"); interpreter.exec("path = \"E:\\src-python\\jython\\Lib\""); interpreter.exec("sys.path.append(path)"); interpreter.exec("print sys.path"); interpreter.exec("a=3; b=5;"); InputStream filepy = new FileInputStream("E:\\input.py"); interpreter.execfile(filepy); filepy.close(); } } 

運行結果:

['E:\\lib\\Lib', '__classpath__', '__pyclasspath__/', u'E:\\src-python\\jython\\Lib'] ['E:\\lib\\Lib', '__classpath__', '__pyclasspath__/', u'E:\\src-python\\jython\\Lib', 'E:\\src-python\\jython\\Lib'] a/b= 0.6

E:\\input.py文件代碼:

from __future__ import division print "a/b=",a/b

其中變量a, b的值由java傳入。

相關文章
相關標籤/搜索