我有以下代码
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
答案 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}}数组中设置它来明确地安排它。