从Java运行Python程序的三种方法

一周前,我介绍了
http://bytes.com/topic/python/insigh...hon-together-c
。从那以后,我意识到也许人们在C中没有太多编程。也许人们在Java编写程序!
在这里,我提出了三种不同的选项,从Java运行Python程序;首先使用(旧的)运行时类,然后使用ProcessBuilder类,最后将Python代码嵌入Java,与Jython(用Java编写的Python解释器!)
运行时方法
首先,让某件事是运行时类的旧方法。

选择 | 换行 | 行号
  1. import java.io.*;
  2.  
  3. class test1{
  4. public static void main(String a[]){
  5. try{
  6.  
  7. String prg = "import sys\nprint int(sys.argv[1])+int(sys.argv[2])\n";
  8. BufferedWriter out = new BufferedWriter(new FileWriter("test1.py"));
  9. out.write(prg);
  10. out.close();
  11. int number1 = 10;
  12. int number2 = 32;
  13. Process p = Runtime.getRuntime().exec("python test1.py "+number1+" "+number2);
  14. BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
  15. int ret = new Integer(in.readLine()).intValue();
  16. System.out.println("value is : "+ret);
  17. }catch(Exception e){}
  18. }
  19. }
  20.  

我们首先制作包含我们的Python程序的Java String PRG,该字符串保存在" test1.py"文件上。接下来,我们将在系统上运行Python解释器,并在运行时类中使用EXEC方法。我们读取从运行时类返回的输出流的输出,然后将其转换为Java INT。
我将上述源代码保存为" test2.java"。我键入以下内容;
Javac test2.java
执行它:
Java test2
过程方法
我认为运行时类方法有点古老。在最新的Java版本中,要使用的是ProcessBuilder类。这为参数提供了更多的结构。

选择 | 换行 | 行号
  1. import java.io.*;
  2.  
  3. class test2{
  4. public static void main(String a[]){
  5. try{
  6.  
  7. String prg = "import sys\nprint int(sys.argv[1])+int(sys.argv[2])\n";
  8. BufferedWriter out = new BufferedWriter(new FileWriter("test1.py"));
  9. out.write(prg);
  10. out.close();
  11. int number1 = 10;
  12. int number2 = 32;
  13.  
  14. ProcessBuilder pb = new ProcessBuilder("python","test1.py",""+number1,""+number2);
  15. Process p = pb.start();
  16.  
  17. BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
  18. int ret = new Integer(in.readLine()).intValue();
  19. System.out.println("value is : "+ret);
  20. }catch(Exception e){System.out.println(e);}
  21. }
  22. }
  23.  

我将上述保存为" test2.java"。然后我键入以下内容;
Javac test2.java
执行它:
Java test2
Jython方法
Java应该是独立的平台,并且要调用本机应用程序(例如Python)并不是非常独立的平台。
有一个用Java编写的Python(Jython)的版本,它使我们可以将Python嵌入到Java程序中。通常,当您要使用外部库时,一个障碍是编译并正确运行它,因此,我们经历了与Jython一起构建和运行简单Java程序的过程。
我们首先获得Jython Jar文件:
http://www.jython.org/downloads.html
(当我写这篇文章时,最新版本是:jython 2.5.3)
我将jython-2.5.3.jar复制到我的Java程序将要的目录。然后我输入以下程序,该程序与前两个程序相同;取两个数字,将它们发送到python,然后添加它们,然后python将其返回到我们的Java程序,在该程序中,该数字输出到屏幕:

选择 | 换行 | 行号
  1. import org.python.util.PythonInterpreter; 
  2. import org.python.core.*; 
  3.  
  4. class test3{
  5. public static void main(String a[]){
  6.  
  7. PythonInterpreter python = new PythonInterpreter();
  8.  
  9. int number1 = 10;
  10. int number2 = 32;
  11.  
  12. python.set("number1", new PyInteger(number1));
  13. python.set("number2", new PyInteger(number2));
  14. python.exec("number3 = number1+number2");
  15. PyObject number3 = python.get("number3");
  16. System.out.println("val : "+number3.toString());
  17. }
  18. }
  19.  

我称此文件为" test3.java",保存并进行以下操作以编译它:
Javac -ClassPath Jython -2.5.3.3.jar test3.java
下一步是尝试运行它,我会做以下方式:
Java -ClassPath Jython -2.5.3.3.jar:。 test3
现在,这使我们能够以独立的方式使用来自Java的Python。这有点慢,实际上感觉就像是三种呈现方法中最慢的方法。尽管如此,它还是很酷的,它是用爪哇写的python解释器...

# 回答1


我们如何通过使用第一或第二种技术将Python代码将字符串值返回JAVA程序的第一个或第二种技术来调用Python函数?
# 回答2


我建议使用课程
ProcessBuilder
实施一个非平凡的解决方案 包括沟通。
即时生成Python代码是一个很酷的想法,但是真的很有价值吗?我看到的大多数问题都涉及调用解决问题(或问题类)的子过程;该代码的发达和调试得很好,因此将其吊销到Java(或C)不被认为是有价值的。或者,吊装是不合理的,因为问题很容易在Python中解决,但在C/C ++/Java中没有解决。
至于返回值,有一些选项:

捕获Python程序的印刷输出。

让Python程序将所需的输出写入定义明确的文件,然后忽略所有其他输出。

检查子过程返回状态并采取相应行动。

您可能需要使用嵌入式Python解释器作为网页的一部分,该网页在受限的环境中执行用户输入Python。例如,该页面可能需要禁止访问所有文件I/O和系统接口命令。
干杯,
奥洛伊!

# 回答3


这对我来说非常有用,但是我面临另一个问题,如果我的python脚本会引发任何错误(例如语法错误),则错误消息不会输入我的Java输出,我总是必须手动运行脚本并检查任何错误。任何想法如何捕获
# 回答4


感谢您分类从Java调用Python的不同方法。我想知道您是否对以下情况有一些想法:
1)如果您使用运行时或ProcessBuilder,是否有一种方法可以使python在呼叫之间运行并将新命令提交现有过程?
2)如果您使用jython,是否有一种方法可以为Python加载C库?
# 回答5


这些解决方案均无效。
# 回答6


我得到"线程中的异常"主体" Importerror:无法导入站点模块及其依赖关系:无模块命名站点"
# 回答7


第一次运行时间的解决方案,保存了我的一天:)

标签: python

评论已关闭