从java运行python脚本产生了KeyError

时间:2017-08-11 11:10:25

标签: java python linux

我有以下代码

  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;
}

调用python脚本来转换图像格式。我遇到的问题是,当我运行此代码时,我收到以下错误

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环境中运行它。

感谢,

ES

1 个答案:

答案 0 :(得分:1)

Runtime.exec()的第二个参数是一系列stings,包含要传递给子进程的环境。您的代码显式将其设置为空数组。因为子项中没有PATH环境变量(或者任何env变量),Python在尝试查找其值时会抛出异常。

您可能希望孩子继承父母的环境,在这种情况下将envp设置为null

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

当然,这假设PATH实际上是在父级环境中设置的。如果不是,您可以通过在运行Java代码之前设置它来安排它,或者通过在传递给envp的{​​{1}}数组中设置它来明确地安排它。