Вызов сценариев Matlab из Django с помощью класса Python Popen - PullRequest
0 голосов
/ 26 октября 2018

Я занимаюсь разработкой приложения Django, которое запускает скрипты Matlab с помощью класса Python Popen. Сценарий python, который вызывает сценарии Matlab, находится в главной папке моего приложения Django (с views.py). Когда я вызываю скрипт из командной строки, он запускается как чудо, но когда я делаю запрос от клиента для запуска соответствующего скрипта python, я получаю следующее предупреждение:

" Copyright 1984-2018 The MathWorks, Inc. R2018a (9.4.0.813654) 64-разрядная (glnxa64) 23 февраля 2018 г. Для начала введите один из них: helpwin, helpdesk или demo Для получения информации о продукте посетите www.mathworks.com. >> [Предупреждение: невозможно создать папку настроек в /var/www/.matlab/R2018a. Расположение папки настроек должно быть доступно для записи. Использование папки временных настроек для этого сеанса MATLAB. Подробнее см. В документации по настройкам.] >>

Мое приложение использует виртуальную среду Python и развертывается на веб-сервере Apache. Вот мой скрипт на python, который вызывает скрипты Matlab:

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 голосов
/ 27 октября 2018

Наконец-то мне удалось самостоятельно найти решение этой проблемы. Проблема возникла из-за пользователя, который вызвал скрипт Matlab. Когда я запускал вышеуказанный скрипт из интерпретатора Python или из оболочки, это был пользователь (с паролем пользователя), который запускал скрипт, а когда я вызывал скрипт из клиента, пользователь был пользователем веб-сервера: 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

и теперь он работает как шарм!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...