jython調用python
args, 為可選參數,會被 JPype 直接傳遞給 JVM 作為 Java 虛擬機的啟動百參數。此處適合所有合法的度 JVM 啟動參數,例如:
-agentlib:libname[=options]
-classpath classpath
-verbose
-Xint
㈡ jython 如何使用 Python 的類庫
Python的代碼可以用Jython運行,只要沒有用到擴展庫。 因為Jython實現了一個Python解析器,可以解析執行Python的代碼。 Jython在import 一個Python文件的時候,會編譯生成.class文件,而不是.pyc文件。 這些.class文件就是普通的Java Class,只不過調用了Jython VM. Jython的限制是無法使用用C寫的Python擴展庫,因為沒有在ABI層兼容CPython。
㈢ jython和python的區別是什麼
我們通常意義上說的python是cpython,也就是完全用C實現的python,它支持C的擴展,不支持java什麼的擴展。
jython是完全用jython實現的python,它支持用java擴展,貌似無法用C擴展。
相關推薦:《python培訓視頻》
jython用途比較少。主要在兩個場景下:
1、操作系統不提供cpython, 只有JAVA可以用。比如sun工作站,或者是某些嵌入式設備。
2、不得不用一些JAVA的包來提供功能。所以只能用jython來調用JAR包。
jython因為有java的即時編譯器和編譯優化效果,所有速度還是不錯的。
不過jython的總體來講,支持包不夠多。不象是cpython 2.7那樣,幾乎所有的包都支持。極其豐富。不過純python的包都可以在jython上安裝使用。
jython的版本號通常比cpython的要低。不過現在到了2.7也基本上持平了。流行的jython就是2.5,2.7兩個版本。
另外jython似乎對於GIL處理的更好些。所以原則上講,並發性能更好。所以jython的線程應該會比cpython的線程更強大。可以更好的利用到java的性能,把CPU的各個核都用上。
另外內存的使用上,按理jython也可以利用到java的一些優點。cpython通常字典超 過2GB內存就會很慢。也許jython要好些。
總體來講,性能上還是cpython要更快些。最快的是pypy,其次是cython, 再次是cpython, jython應該在後面。
㈣ 用java 調用python webservice 是怎麼調的
這次出差,我接觸最多的是spss,由於項目基於j2ee開發,而java又不能直接取得spss統計結果,好在spss對python的支持還行,最終成功實現了這個模塊。感謝前輩們做出的貢獻,沒有你們,我就不能這樣迅速、順利的完成項目,且別說寫這篇文章了。
在前期准備中,我摸索、嘗試了三種實現:jython,http,soap,在網上查了很多相關資料,都是只言片語,自己看了還要結合其他的資料才能弄個明白。當然,在這探索的過程中,我是幸運的,每天都讓我充滿驚喜,每天都有新的收獲。
jython是java版本的python,也就是java的完全實現。java代碼中,可以調用python的方法,缺點是,jython中導入第三方python mole時,不是那麼回事。因為spss的python api主要是一個.pyd的二進制文件,jython導包是按照java的位元組碼來導入的,所以當在jython中導入spss的python api時會出錯,這個想法徹底破滅。
http實現是在現有的B/S交互實現上突發奇想的,python中實現一個簡單的web server只要幾十行代碼,java使用apache的httpclient訪問,現在想來確實有點大材小用,自己寫一個http socket來請求和響應也寫不了多少代碼。最後還是實現了,支持spss中文,但是數據封包都要自己來實現,還是有嫌麻煩。
soap實現最簡單,server端幾十行代碼搞定。由於我把spss命令都封裝到一個方法中執行了,所以就沒有用wsdl來生成java代碼了,我使用了較底層的java的http socket,手動對SOAP-ENV打包,並向server端請求,手動解析響應數據。缺點是:SOAP對中文的支持,無論怎麼轉碼,不是python解析SOAP-ENV報錯,就是python執行spss命令報錯。
㈤ 怎麼使用java運行python腳本
1.直接執行Python腳本代碼
引用 org.python包
1 PythonInterpreter interpreter = new PythonInterpreter();
2 interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); "); ///執行python腳本
2. 執行python .py文件
1 PythonInterpreter interpreter = new PythonInterpreter();
2 InputStream filepy = new FileInputStream("D:\\demo.py");
3 interpreter.execfile(filepy); ///執行python py文件
4 filepy.close();
3. 使用Runtime.getRuntime()執行腳本文件
這種方式和.net下面調用cmd執行命令的方式類似。如果執行的python腳本有引用第三方包的,建議使用此種方式。使用上面兩種方式會報錯java ImportError: No mole named arcpy。
1 Process proc = Runtime.getRuntime().exec("python D:\\demo.py");
2 proc.waitFor();
㈥ java調用python,有第三方包gensim,怎麼調用呢,是報錯。求教....
Jython(原JPython),是一個用Java語言寫的Python解釋器。
在沒有第三方模塊的情況下,通常選擇利用Jython來調用Python代碼,
它是一個開源的JAR包,你可以到官網下載
一個HelloPython程序
importorg.python.util.PythonInterpreter;
publicclassHelloPython{
publicstaticvoidmain(String[]args){
PythonInterpreterinterpreter=newPythonInterpreter();
interpreter.exec("print('hello')");
}
}
什麼是PythonInterpreter?它的中文意思即是「Python解釋器」。我們知道Python程序都是通過解釋器來執行的,我們在Java中創建一個「解釋器」對象,模擬Python解釋器的行為,通過exec("Python語句")直接在JVM中執行Python代碼,上面代碼的輸出結果為:hello
在Jvm中執行Python腳本
interpreter.execfile("D:/labs/mytest/hello.py");
如上,將exec改為execfile就可以了。需要注意的是,這個.py文件不能含有第三方模塊,因為這個「Python腳本」最終還是在JVM環境下執行的,如果有第三方模塊將會報錯:javaImportError:Nomolenamedxxx
僅在Java中調用Python編寫的函數
先完成一個hello.py代碼:
defhello():
return'Hello'
在Java代碼中調用這個函數:
importorg.python.core.PyFunction;
importorg.python.core.PyObject;
importorg.python.util.PythonInterpreter;
publicclassHelloPython{
publicstaticvoidmain(String[]args){
PythonInterpreterinterpreter=newPythonInterpreter();
interpreter.execfile("D:/labs/hello.py");
PyFunctionpyFunction=interpreter.get("hello",PyFunction.class);//第一個參數為期望獲得的函數(變數)的名字,第二個參數為期望返回的對象類型
PyObjectpyObject=pyFunction.__call__();//調用函數
System.out.println(pyObject);
}
}
上面的代碼執行結果為:Hello
即便只是調用一個函數,也必須先載入這個.py文件,之後再通過Jython包中所定義的類獲取、調用這個函數。
如果函數需要參數,在Java中必須先將參數轉化為對應的「Python類型」,例如:
__call__(newPyInteger(a),newPyInteger(b))
a,b的類型為Java中的int型,還有諸如:PyString(Stringstring)、PyList(Iterator<PyObject>iter)等。
詳細可以參考官方的api文檔。
包含第三方模塊的情況:一個手寫識別程序
這是我和舍友合作寫的一個小程序,完整代碼在這里:
importjava.io.*;
classPyCaller{
privatestaticfinalStringDATA_SWAP="temp.txt";
privatestaticfinalStringPY_URL=System.getProperty("user.dir")+"\test.py";
(Stringpath){
PrintWriterpw=null;
try{
pw=newPrintWriter(newFileWriter(newFile(DATA_SWAP)));
}catch(IOExceptione){
e.printStackTrace();
}
pw.print(path);
pw.close();
}
publicstaticStringreadAnswer(){
BufferedReaderbr;
Stringanswer=null;
try{
br=newBufferedReader(newFileReader(newFile(DATA_SWAP)));
answer=br.readLine();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnanswer;
}
publicstaticvoidexecPy(){
Processproc=null;
try{
proc=Runtime.getRuntime().exec("python"+PY_URL);
proc.waitFor();
}catch(IOExceptione){
e.printStackTrace();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
//測試碼
publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{
writeImagePath("D:\labs\mytest\test.jpg");
execPy();
System.out.println(readAnswer());
}
}
實際上就是通過Java執行一個命令行指令。