1. 程式人生 > >java和python互相調用

java和python互相調用

ica per hash aik tps 翻譯器 ber 代碼 userinfo

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

java調用python

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

供python調用的java類

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

測試代碼

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

main方法類

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

java和python互相調用