gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:39:12 24 4
gpt4 key购买 nike

我正在开发一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com