java和python互相調用

來源:互聯網
上載者:User

標籤:串連   erp   dem   put   val   views   nal   pre   很多   

java和python互相調用 

        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()  

 

java和python互相調用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.