我正在开发一个Django应用程序,该应用程序使用Python的Popen类运行Matlab脚本。调用Matlab脚本的python脚本位于我的Django应用的主文件夹中(包含views.py)。当我从命令行调用脚本时,它就像一个超级按钮一样运行,但是当我从客户端发出请求以运行相应的python脚本时,会收到以下警告:
“
我的应用程序使用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
有什么建议吗?
答案 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
现在它就像一个魅力!