使用Python的Popen类从Django调用Matlab脚本

时间:2018-10-26 12:11:37

标签: python django matlab

我正在开发一个Django应用程序,该应用程序使用Python的Popen类运行Matlab脚本。调用Matlab脚本的python脚本位于我的Django应用的主文件夹中(包含views.py)。当我从命令行调用脚本时,它就像一个超级按钮一样运行,但是当我从客户端发出请求以运行相应的python脚本时,会收到以下警告:

版权所有1984-2018 The MathWorks,Inc. R2018a(9.4.0.813654)64位(glnxa64)2018年2月23日,要开始使用,请键入以下内容之一:helpwin,helpdesk或demo有关产品信息,请访问www.mathworks.com >> [警告:无法在/var/www/.matlab/R2018a中创建首选项文件夹。首选项文件夹位置必须是可写的。为此MATLAB会话使用临时首选项文件夹。有关更多详细信息,请参阅首选项文档。] >>

我的应用程序使用Python虚拟环境,并且正在与Apache Web服务器一起部署。 这是调用Matlab脚本的python脚本:

import os
import subprocess as sp
import pymat_config

def pymat_run():
    pwd = pymat_config.pwd_config['pwd']

    cmd1 = "-r \"Arg_in = '/path/to/my/main/folder/input.txt'; Arg_out = '/path/to/my/main/folder/file.txt';  matlab_script1\""

    baseCmd1 = ['/usr/local/MATLAB/R2018a/bin/matlab', '-nodesktop', '-nosplash', '-nodisplay', 'nojvm', cmd1]

    os.chdir('/path/to/matlab_script1')

    sudo_cmd = sp.Popen(['echo', pwd], stdout=sp.PIPE)
    exec1 = sp.Popen(['sudo', '-S'] + baseCmd1, stdin=sudo_cmd.stdout, stdout=sp.PIPE, stderr=sp.PIPE)
    out, err = exec1.communicate()

    return out

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

最后,我设法自己找到了解决该问题的方法。问题来自调用Matlab脚本的那种用户。当我从Python解释器或外壳程序运行上述脚本时,运行脚本的是用户(使用用户密码),而当我从客户端调用脚本时,该用户是Web服务器的用户:www -数据。 因此,首先为了避免上述警告,我使用以下命令将www-data用户的权限授予了/ var / www文件夹:

sudo chown -R www-data /var/www/

此后,“警告”消失了,但脚本仍未运行,因为它在内部要求www-data的密码,并从pymat_config文件中获取用户的密码。 为了解决这个问题,我编辑了/ etc / sudoers文件,以便www-data能够在不询问密码的情况下调用Matlab脚本。所以我添加了以下行:

www-data ALL=(ALL) NOPASSWD: /usr/local/MATLAB/R2018a/bin/matlab

现在它就像一个魅力!