【问题标题】:Call java program (with arguments) from Python and return results back to Python从 Python 调用 java 程序(带参数)并将结果返回给 Python
【发布时间】:2018-09-04 16:02:28
【问题描述】:

我必须从 Python 执行一个 java 文件(传递一个参数),并在执行后将结果返回给调用它的脚本。我写了一个小的 java 测试程序,它接受一个参数并将一些东西打印到标准输出。这是java程序

import java.util.*;
class TestX
{
       public static void main(String args[])
       {
            String someString = "Your input";
            System.out.println(someString + " " + args[0]);
            int resultOfSomething = 45;
            String someOutput = "Program's output is " + resultOfSomething;
            System.out.println(someOutput);
       }
}

这里是调用java程序的Python脚本

import os.path,subprocess
from subprocess import STDOUT,PIPE

def compile_java(java_file):
    subprocess.check_call(['javac', java_file])

def execute_java(java_file):
    java_class,ext = os.path.splitext(java_file)
    cmd = ['java', java_class]
    proc = subprocess.Popen(cmd, stdout=PIPE, stderr=STDOUT)
    stdout,stderr = proc.communicate(input='SomeInputstring')
    print ('This was "' + stdout + '"')

compile_java('TestX.java')
execute_java('TestX.java')

我应该提到我不熟悉java。我通过这个命令javac TestX.java编译了这个小java程序。这创建了一个类文件。当我使用 java TestX SomeTestString 从命令行运行 java 程序时,微型 java 程序按预期工作并向控制台输出一些文本。

现在的问题;当我使用上面的代码从 Python 运行相同的 java 程序时 - 1) 出现错误

This was "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

        at TestX.main(TestX.java:7)
"

当我在 Python 程序中注释掉 print ('This was "' + stdout + '"') 行时,Python 程序运行并且似乎执行了 java 程序,但没有任何内容返回到控制台。我在这里遗漏了一些非常简单的东西,或者这只是我犯的一个愚蠢的错误。任何指针?谢谢。

我尝试了几种不同的方法来输出结果,比如使用 printf,甚至使用这个类 StdOut。它们的行为似乎都一样。

如果我要简单地解释一下,就是这样; 我的 Python 脚本应该调用一个带有单个参数的 java 程序。 java 程序接受输入,执行某些函数并返回一个结果,我应该能够从调用它的 Python 程序中读取该结果。

【问题讨论】:

    标签: java python subprocess popen


    【解决方案1】:

    命令行参数不是标准输入。 args[0] 是一个命令行参数。你应该可以这样做

    cmd = ['java', java_class, 'SomeInputString']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2019-03-29
      • 2019-09-07
      • 2017-02-14
      • 2019-06-15
      • 1970-01-01
      • 2012-08-21
      相关资源
      最近更新 更多