相同的cmd在shell中工作,但不在subprocess.Popen()中,用于Django下基于matlab的java程序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了相同的cmd在shell中工作,但不在subprocess.Popen()中,用于Django下基于matlab的java程序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3325字,纯文字阅读大概需要5分钟。
内容图文
![相同的cmd在shell中工作,但不在subprocess.Popen()中,用于Django下基于matlab的java程序](/upload/InfoBanner/zyjiaocheng/964/7f050e79a34d48649a19e454b8be8121.jpg)
背景: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.<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
内容总结
以上是互联网集市为您收集整理的相同的cmd在shell中工作,但不在subprocess.Popen()中,用于Django下基于matlab的java程序全部内容,希望文章能够帮你解决相同的cmd在shell中工作,但不在subprocess.Popen()中,用于Django下基于matlab的java程序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。