如何使用ProcessBuilder将值从Python脚本返回到Java?
我正在尝试使用ProcessBuilder将python脚本的返回值转换为Java。我期待Java中的值“这就是我正在寻找的”。有人能告诉我下面的逻辑有什么问题吗 我正在使用python3,并希望使用java标准库完成这项工作 test.py代码如何使用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]]()
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);