java调mcr处理慢,相同的cmd在shell中工作,但不在subprocess.Popen()中,用于Django下基于matlab的java程序...

背景: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值