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

2024-09-29 07:32:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个Django应用程序,它用Python的Popen类运行Matlab脚本。调用Matlab脚本的python脚本位于我的Django应用程序的主文件夹中(带有视图.py). 当我从命令行调用脚本时,它运行得很正常,但当我从客户端发出请求以运行相应的python脚本时,我收到以下警告:

“<;M A T L A B(R)>;版权所有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虚拟环境,它是与apacheweb服务器一起部署的。 下面是我调用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

有什么建议吗?你知道吗


Tags: pathimportgt脚本文件夹config应用程序pwd
1条回答
网友
1楼 · 发布于 2024-09-29 07:32:50

最后我自己设法找到了解决这个问题的办法。问题来自调用Matlab脚本的用户。当我从Python解释器或shell运行上述脚本时,运行脚本的是用户(带有用户密码),而当我从客户端调用脚本时,用户是web服务器的用户:www data。 因此,为了避免上述警告,我首先使用以下命令向www data user授予/var/www文件夹的权限:

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

之后,“警告”消失了,但脚本仍然没有运行,因为它在内部请求www数据的密码,并从pymatèu配置文件中获取用户的密码。 为了解决这个问题,我编辑了/etc/sudoers文件,以便www数据能够在不询问密码的情况下调用Matlab脚本。所以我加了一行:

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

现在它就像一个魔咒!你知道吗

相关问题 更多 >