簡體   English   中英

java運行環境無結果

[英]java runtime environment no result

我試圖在我的 java 代碼中調用 python 。 但是我發現如果我在我的 python 代碼中導入 numpy ,這是我的 java 代碼

Process pcs = Runtime.getRuntime().exec(cmd);
String result = null;
    

BufferedInputStream in = new BufferedInputStream(pcs.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in));        
System.out.println("\nExecuting python script file now.");
String lineStr = null;
    while ((lineStr = br.readLine()) != null) {
    result = lineStr;
}
br.close();
in.close();
System.out.println("done!");
System.out.println(result);

這是我的 python 代碼:

import sys 
import os
import numpy as np

a = sys.argv[1]
b = sys.argv[2]
print("hello world!")
print("%s * %s = %s"%(a,b,int(a)*int(b)))

如果我不包括“將 numpy 作為 np 導入”的結果:10 * 11 = 110

如果包含“將 numpy 作為 np 導入”的結果:null

有什么直觀的解釋嗎?

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Hello{
  public static void main(String[] args)throws java.io.IOException{
    Process pcs=Runtime.getRuntime().exec("python test.py 8 5");// in linux or unix use python3 or python
    String result=null;
    BufferedInputStream in = new BufferedInputStream(pcs.getInputStream());
    BufferedReader br = new BufferedReader(new InputStreamReader(in));        
    System.out.println("\nExecuting python script file now.");
    String lineStr = null;
    while ((lineStr = br.readLine()) != null) {
      result = lineStr;
    }
    br.close();
    in.close();
    System.out.println("done!");
    System.out.println(result);
  }
 }

java代碼
編譯:
javac Hello.java
跑:
java 你好

#test.py
import sys 
import os
import numpy as np
a = sys.argv[1]
b = sys.argv[2]
print("hello world!")
print("%s * %s = %s"%(a,b,int(a)*int(b)))

您在應用程序中設置了正確的 PYTHONPATH 嗎? 當您在代碼import numpy as np ,您可能會收到空的 STDOUT 和 STDERR 中的 ModuleNotFoundError。 您可以通過提取 STDERR 進行確認 - 或使用以下代碼進行檢查:

Launch.exe(cmd);

其中 Launch.java 是:

public class Launch
{
    /** Launch using FILE redirects */
    public static int exec(String[] cmd) throws InterruptedException, IOException
    {
        System.out.println("exec "+Arrays.toString(cmd));

        Path tmpdir = Path.of(System.getProperty("java.io.tmpdir"));
        ProcessBuilder pb = new ProcessBuilder(cmd);

        Path out = tmpdir.resolve(cmd[0]+"-stdout.log");
        Path err = tmpdir.resolve(cmd[0]+"-stderr.log");
        pb.redirectError(out.toFile());
        pb.redirectOutput(err.toFile());

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

        System.out.println("Exit "+rc +' '+(rc == 0 ? "OK":"**** ERROR ****")
                          +" STDOUT \""+Files.readString(out)+'"'
                          +" STDERR \""+Files.readString(err)+'"');
        System.out.println();
        return rc;
    }
}

使用 numpy 的修復應該是訪問 ProcessBuilder pb.environment()並在調用start()之前為子進程設置 PYTHONPATH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM