亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 ProcessBuilder 將值從 Python 腳本返回到 Java?

如何使用 ProcessBuilder 將值從 Python 腳本返回到 Java?

SMILET 2022-09-07 17:07:05
我正在嘗試使用ProcessBuilder將python腳本的返回值獲取到Java中。我期望在Java中具有“這就是我正在尋找的”的值。誰能告訴我下面的邏輯中有什么問題?我正在使用python3,并希望使用java標準庫來完成此操作。test.py 代碼import sysdef 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:0value is : null
查看完整描述

2 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

當您從另一個進程生成一個進程時,它們只能(主要是)通過其輸入和輸出流進行通信。因此,你不能期望 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)

public static void main(String[] args) throws Exception {       

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

        ProcessBuilder pb = new ProcessBuilder()

            .command("python", "-u", filePath, "main33");        

        Process p = pb.start(); 

        BufferedReader in = new BufferedReader(

            new InputStreamReader(p.getInputStream()));

        StringBuilder buffer = new StringBuilder();     

        String line = null;

        while ((line = in.readLine()) != null){           

            buffer.append(line);

        }

        int exitCode = p.waitFor();

        System.out.println("Value is: "+buffer.toString());                

        System.out.println("Process exit value:"+exitCode);        

        in.close();

    }


查看完整回答
反對 回復 2022-09-07
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

您過度使用了變量 。它不能既是當前的輸出線,也不能是到目前為止看到的所有線。添加第二個變量以跟蹤累積輸出。line


String line;

StringBuilder output = new StringBuilder();


while ((line = in.readLine()) != null) {

    output.append(line);

          .append('\n');

}


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


查看完整回答
反對 回復 2022-09-07
  • 2 回答
  • 0 關注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號