背景:Ubuntu 64bit机器.我需要从django调用一个基于matlab的jar(部署在apache上).这是问题,当我在shell上运行命令时,它可以工作;但是,当我在django代码中调用subprocess.Popen({{cmd}})时,会抛出异常.
编辑:我尝试打开python shell并调用subprocess.Popen({{cmd}}).我编写了一个python脚本文件,并在其中添加相同的代码.他们都工作.在django上运行代码时失败真是太奇怪!!!!!!
详情如下:
cmd:java -jar A.jar param1 param2 param3 param4
直接在shell中运行时,一切正常.使用python代码运行时,例外是:
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getProxyLibraryDir(MCRConfiguration.java:178)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.get(MCRConfiguration.java:77)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.(MCRConfiguration.java:87)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:92)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.(MCRConfiguration.java:66)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:71)
at com.mathworks.toolbox.javabuilder.internal.MWMCR.(MWMCR.java:1466)
at autoBlockJava.AutoBlockJavaMCRFactory.newInstance(AutoBlockJavaMCRFactory.java:83)
at autoBlockJava.AutoBlockJavaMCRFactory.newInstance(AutoBlockJavaMCRFactory.java:94)
at autoBlockJava.AutoBlockJavaSharedMCRFactory$3.call(AutoBlockJavaSharedMCRFactory.java:95)
at autoBlockJava.AutoBlockJavaSharedMCRFactory$3.call(AutoBlockJavaSharedMCRFactory.java:93)
at autoBlockJava.AutoBlockJavaSharedMCRFactory.getInstance(AutoBlockJavaSharedMCRFactory.java:72)
at autoBlockJava.AutoBlockJavaSharedMCRFactory.newInstance(AutoBlockJavaSharedMCRFactory.java:93)
at autoBlockJava.manualMain.(manualMain.java:97)
at autoblock.AutoBlock.main(AutoBlock.java:29)
Caused by: java.lang.NullPointerException
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ProxyLibraryDir.get(MCRConfiguration.java:143)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ProxyLibraryDir.(MCRConfiguration.java:173)
... 15 more
我完全糊涂了.我真的不知道现在是什么原因.
解决方法:
我认为你的问题与Python,Django或Java无关,但只与Matlab调用外部程序的方式有关.
在Linux上,Matlab在子进程的环境中设置变量LD_LIBRARY_PATH.例如,在我的系统上:
>> getenv('LD_LIBRARY_PATH')
ans =
/opt/MATLAB/R2013a/sys/os/glnxa64:/opt/MATLAB/R2013a/bin/glnxa64:/opt/MATLAB/R2013a/extern/lib/glnxa64:/opt/MATLAB/R2013a/runtime/glnxa64:/opt/MATLAB/R2013a/sys/java/jre/glnxa64/jre/lib/amd64/native_threads:/opt/MATLAB/R2013a/sys/java/jre/glnxa64/jre/lib/amd64/server:/opt/MATLAB/R2013a/sys/java/jre/glnxa64/jre/lib/amd64
显然,这个设置会使子进程无法使用某些系统库(或只是正确的glibc版本?):
>> !konsole
konsole: /opt/MATLAB/R2013a/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /usr/lib/libstreamanalyzer.so.0)
konsole: /opt/MATLAB/R2013a/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /usr/lib/libstreams.so.0)
可以通过显式取消设置LD_LIBRARY_PATH来解决该问题
setenv('LD_LIBRARY_PATH')
我不确定Matlab设置LD_LIBRARY_PATH的目的是什么,我猜想必须通过取消设置来破坏某些特殊功能.但是,我已经在我的startup.m中使用了上面这一行多年了,而且我没有遇到任何问题.
标签:python,apache,java,django,matlab
来源: https://codeday.me/bug/20190708/1406774.html