java和python互相調用


 

java和python互相調用

 作者:xuaijun
 日期:2017.1.1

        python作為一種腳本語言,大量用於測試用例和測試代碼的編寫,尤其適用於交互式業務場景。實際應用中,很多網管系統做的如交換機、防火牆等設備升級,往往和設備交互的命令以及設備回顯的信息都是在python腳本中寫好,java工程直接調用相應的python腳本,執行升級的具體步驟。但是具體的命令一般通過和設備建立的ssh連接交互,最后python又重新調回java實現的ssh功能。

        Jython是一種完整的語言,而不是一個Java翻譯器或僅僅是一個Python編譯器,它是一個Python語言在Java中的完全實現。Jython也有很多從CPython中繼承的模塊庫。最有趣的事情是Jython不像CPython或其他任何高級語言,它提供了對其實現語言的一切存取。所以Jython不僅給你提供了Python的庫,同時也提供了所有的Java類。

        java和python的互相調用,就需要用到Jython,可在該連接下載Jython相關jar包:https://repo1.maven.org/maven2/org/python/jython

Jython環境類

 

[java]  view plain  copy
 
  1. package com.webim.test.jython;  
  2.   
  3. import org.python.core.PySystemState;  
  4. import org.python.util.PythonInterpreter;  
  5.   
  6. /** 
  7.  * Jython環境,生存python解釋器 
  8.  * @author webim 
  9.  * 
  10.  */  
  11. public final class JythonEnvironment  
  12. {  
  13.     private static JythonEnvironment INSTANCE = new JythonEnvironment();  
  14.       
  15.     /** 
  16.      * 私有構造方法 
  17.      */  
  18.     private JythonEnvironment()  
  19.     {  
  20.     }  
  21.       
  22.     /** 
  23.      * 獲取單例 
  24.      * @return JythonEnvironment 
  25.      */  
  26.     public static JythonEnvironment getInstance()  
  27.     {  
  28.         return INSTANCE;  
  29.     }  
  30.       
  31.     /** 
  32.      * 獲取python系統狀態,可根據需要指定classloader/sys.stdin/sys.stdout等 
  33.      * @return PySystemState 
  34.      */  
  35.     private PySystemState getPySystemState()  
  36.     {  
  37.         PySystemState.initialize();  
  38.         final PySystemState py = new PySystemState();  
  39.         py.setClassLoader(getClass().getClassLoader());  
  40.         return py;  
  41.     }  
  42.       
  43.     /** 
  44.      * 獲取python解釋器 
  45.      * @return PythonInterpreter 
  46.      */  
  47.     public PythonInterpreter getPythonInterpreter()  
  48.     {  
  49.         PythonInterpreter inter = new PythonInterpreter(null, getPySystemState());  
  50.         return inter;  
  51.     }  
  52. }  

 

 

java調用python

 

[java]  view plain  copy
 
  1. package com.webim.test.jython;  
  2.   
  3. import java.util.Map;  
  4. import java.util.Map.Entry;  
  5.   
  6. import org.python.util.PythonInterpreter;  
  7. /*enum的這個用法,可以作為變種的安全單例,值得借鑒哦 ^_^ */  
  8. public enum ExecPython  
  9. {  
  10.     INSTANCE;  
  11.       
  12.     public void execute(String scriptFile, Map<String,String> properties)  
  13.     {  
  14.         //獲取python解釋器  
  15.         final PythonInterpreter inter = JythonEnvironment.getInstance().getPythonInterpreter();  
  16.           
  17.         //設置python屬性,python腳本中可以使用  
  18.         for (Entry<String,String> entry : properties.entrySet())  
  19.         {  
  20.             inter.set(entry.getKey(), entry.getValue());  
  21.         }  
  22.           
  23.         try  
  24.         {  
  25.             //通過python解釋器調用python腳本  
  26.             inter.execfile(scriptFile);  
  27.         }  
  28.         catch (Exception e)  
  29.         {  
  30.             System.out.println("ExecPython encounter exception:" + e);  
  31.         }  
  32.     }  
  33. }  

 

供python調用的java類

[java]  view plain  copy
 
  1. package com.webim.test.jython;  
  2.   
  3. /** 
  4.  * 供python腳本調用的java類 
  5.  * @author webim 
  6.  * 
  7.  */  
  8. public class SayHello  
  9. {  
  10.     private String userName;  
  11.   
  12.     public String getUserName()  
  13.     {  
  14.         return userName;  
  15.     }  
  16.   
  17.     public void setUserName(String userName)  
  18.     {  
  19.         this.userName = userName;  
  20.     }  
  21.       
  22.     public void say(int i)  
  23.     {  
  24.         System.out.println(i + ":Hello " + userName);  
  25.     }  
  26. }  

測試代碼

 

 

[java]  view plain  copy
 
  1. package com.webim.test.jython;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. /** 
  7.  * 測試java和python的調用流程 
  8.  * @author webim 
  9.  * 
  10.  */  
  11. public enum TestExecPython  
  12. {  
  13.     INSTANCE;  
  14.       
  15.     public void test()  
  16.     {  
  17.         String scriptFile = "test.py";  
  18.         Map<String,String> properties = new HashMap<String,String>();  
  19.         properties.put("userName", "Demo");  
  20.           
  21.         ExecPython.INSTANCE.execute(scriptFile, properties);  
  22.     }  
  23. }  

 

main方法類

 

 

[java]  view plain  copy
 
  1. package com.webim.test.main;  
  2.   
  3. import com.webim.test.jython.TestExecPython;  
  4.   
  5. public class Main   
  6. {  
  7.     public static void main(String[] args)   
  8.     {  
  9.         TestExecPython.INSTANCE.test();  
  10.     }  
  11.   
  12. }  
python腳本
[python]  view plain  copy
 
  1. #unicode=UTF-8  
  2.   
  3. #################################################  
  4. #通過java package導入java類  
  5. from com.webim.test.jython import SayHello  
  6.   
  7. execpy = SayHello()  
  8.   
  9. #################################################  
  10. #將python屬性傳入后續調用的java實例  
  11. execpy.setUserName(userName)  
  12.   
  13. def say():  
  14.     execpy.say(5)  
  15.     return  
  16.   
  17. say()  

 


免責聲明!

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



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