Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用ProcessBuilder将值从Python脚本返回到Java?_Java_Python - Fatal编程技术网

如何使用ProcessBuilder将值从Python脚本返回到Java?

如何使用ProcessBuilder将值从Python脚本返回到Java?,java,python,Java,Python,我正在尝试使用ProcessBuilder将python脚本的返回值转换为Java。我期待Java中的值“这就是我正在寻找的”。有人能告诉我下面的逻辑有什么问题吗 我正在使用python3,并希望使用java标准库完成这项工作 test.py代码 import sys def main33(): return "This is what I am looking for" if __name__ == '__main__': globals()[sys.argv[1]]()

我正在尝试使用ProcessBuilder将python脚本的返回值转换为Java。我期待Java中的值“这就是我正在寻找的”。有人能告诉我下面的逻辑有什么问题吗

我正在使用python3,并希望使用java标准库完成这项工作

test.py代码

import sys

def main33():
    return "This is what I am looking for"


if __name__ == '__main__':
    globals()[sys.argv[1]]()
Java代码

String filePath = "D:\\test\\test.py";

ProcessBuilder pb = new ProcessBuilder().inheritIO().command("python", "-u", filePath, "main33");

Process p = pb.start();
int exitCode = p.waitFor();

BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";

line = in.readLine();
while ((line = in.readLine()) != null){
    line = line + line;
}

System.out.println("Process exit value:"+exitCode);
System.out.println("value is : "+line);
in.close();
输出

Process exit value:0
value is : null

当您从另一个进程派生一个进程时,它们只能(更确切地说)通过其输入和输出流进行通信。因此,您不能期望python中main33()的返回值到达Java,它将仅在python运行时环境中结束生命。如果需要将某些内容发送回Java进程,则需要将其写入print()

修改了python和java代码段

import sys
def main33():
    print("This is what I am looking for")

if __name__ == '__main__':
    globals()[sys.argv[1]]()
    #should be 0 for successful exit
    #however just to demostrate that this value will reach Java in exit code
    sys.exit(220)

您过度使用了变量
。它不可能是当前的输出线,也不可能是目前为止看到的所有输出线。添加第二个变量以跟踪累计输出

String line;
StringBuilder output = new StringBuilder();

while ((line = in.readLine()) != null) {
    output.append(line);
          .append('\n');
}

System.out.println("value is : " + output);

这仍然不会将python的输出添加到Java中的行中。行仍然为空。python脚本的输出打印在控制台上。**这就是我要寻找的进程退出值:220值是:null**,因为在创建ProcessBuilder时,您使用了Inheritario(),子进程的IO与父进程合并。另外,您的waitFor()调用位于错误的位置。我已经更新了我的解决方案,希望这是您正在寻找的。谢谢您的更正。这项工作现在正如预期的那样。
String line;
StringBuilder output = new StringBuilder();

while ((line = in.readLine()) != null) {
    output.append(line);
          .append('\n');
}

System.out.println("value is : " + output);