加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

相同的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
直接在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读