2017-08-11 9 views
0

私は画像フォーマットを変換するためのPythonスクリプトを呼び出す次のコードはKeyError例外

public int fitsToJpg(String imagePath) throws IOException, InterruptedException{ 
     String jpegFile = newJpegFileFullPath(imagePath); 
     String pythonPath = copyPythonFile(); 
     Runtime r = Runtime.getRuntime();   
     String pythonExeString = String.format("python %s %s %s",pythonPath,imagePath, jpegFile);   
     Process p = r.exec(pythonExeString, new String[]{}, new File(System.getProperty("user.dir")));        
     if(p.waitFor() != 0) {    
      LoggingServices.createWarningLogMessage(IOUtils.toString(p.getErrorStream(), "UTF-8"), LOGGER); 
      return 1; 
     } 
     return 0; 
} 

を持って生産しました。私が持っている問題は、このコードを実行すると次のエラーが発生するということです。

File "/home/scinderadmin/lib/dist/fits2jpg.py", line 2, in <module> 
import cv2 
File "/usr/lib64/python2.7/site-packages/cv2/__init__.py", line 5, in <module> 
os.environ["PATH"] += os.pathsep + os.path.dirname(os.path.realpath(__file__)) 
File "/usr/lib64/python2.7/UserDict.py", line 23, in __getitem__ 
raise KeyError(key) 
KeyError: 'PATH' 

Pythonコードを直接実行するとすべて動作します。私はこれが環境と関係していると思いますが、私が間違ってやっていることを理解することはできません。どんな提案も歓迎されます。私はgnu Linux環境でこれを実行しているところで、 です。 Runtime.exec()

おかげで、

ES

答えて

1

第二引数は、子プロセスに渡す環境を含む刺さの配列です。あなたのコードは、それを明示的に空の配列に設定します。子には環境変数PATHが存在しないため、Pythonはその値をルックアップしようとすると例外をスローします。

あなたはおそらく子供がnullenvpを設定した場合には、親の環境を継承したい:もちろん

Process p = r.exec(pythonExeString, null, new File(System.getProperty("user.dir"))); 

これはPATHが実際に親の環境に設定されていることを前提としています。そうでない場合は、Javaコードを実行する前に設定するか、exec()に渡されたenvp配列に明示的に設定することで、それを設定することができます。

+0

面白いことに、私は第3の引数を調べましたが、第2の引数は検索しませんでした。 – Goozo

関連する問題