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

标签 python django matlab

我正在开发一个 Django 应用程序,它使用 Python 的 Popen 类运行 Matlab 脚本。调用 Matlab 脚本的 python 脚本位于我的 Django 应用程序的主文件夹中(带有views.py)。当我从命令行调用脚本时,它运行起来就像一个 super 按钮,但是当我从客户端发出请求以运行相应的 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 session 使用临时首选项文件夹。有关更多详细信息,请参阅首选项文档。] >>

我的应用程序使用 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

有什么建议吗?

最佳答案

最后我自己找到了解决这个问题的方法。问题来自于调用 Matlab 脚本的用户。当我从 Python 解释器或 shell 运行上述脚本时,运行脚本的是用户(带有用户密码),而当我从客户端调用脚本时,用户是 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

现在它运行起来就像一个魅力!

关于python - 使用 Python 的 Popen 类从 Django 调用 Matlab 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53008481/

相关文章:

python - 如何从视差图中获取3D度量值?

Django 相当于 SQL REPLACE

django - 仅在事务完成后触发 post_save 信号

django - 如何在 DRF View 中调用函数?

Matlab Mex文件编译

python - 如何从字符串中提取简单的数字表达式数字?

python - 如何在越来越多的任务上使用 asyncio.wait?

matlab - 自由能强化学习实现

arrays - 在 MATLAB 中将函数分布在数组的单个维度上?

python - 通过数据帧的子集更有效地使用 Python for 循环