相同的cmd在shell中工作,但不在subprocess.Popen()中,用于Django
发布时间:2020-12-16 01:58:04 所属栏目:安全 来源:网络整理
导读:背景:Ubuntu 64bit机器.我需要从 django调用一个基于matlab的jar(部署在apache上).这是问题,当我在shell上运行命令时,它可以工作;但是,当我在django代码中调用subprocess.Popen({{cmd}})时,会抛出异常. 编辑:我尝试打开 python shell并调用subprocess.Pope
背景: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 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.<clinit>(MCRConfiguration.java:87) at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:92) at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.<clinit>(MCRConfiguration.java:66) at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:71) at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(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.<init>(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.<clinit>(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中使用了上面这一行多年了,而且我没有遇到任何问题. 另见:Start application from Matlab (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |