Запуск команды Python по ssh на компьютер и запуск MATLAB на этом компьютере

#python #matlab #ssh

#python #matlab #ssh

Вопрос:

Я пытаюсь запустить эту команду в Python3. Каждая часть по отдельности работает корректно, но я не могу заставить их работать вместе.

 os.system('ssh -t user@computer 'cd /MatLabFolder; /Applications/MATLAB_R2017a.app/bin/matlab -r "cd /Test; try, run('/Test/TF03_MatLabCommands_and_results.m'); end; quit"; bash -l'')
  

На данный момент TF03_MatLabCommands_and_results.m в нем содержится только следующее

 in_dir_list={'/Volumes/promiseraid9/workspace/colleen/NewResiduals/Test/58514_TF03_default','/Volumes/promiseraid9/workspace/colleen/NewResiduals/Test/58514_TF03_mask10'};
out_dir_list={'/Volumes/promiseraid9/workspace/colleen/NewResiduals/Test/58514_TF03_default','/Volumes/promiseraid9/workspace/colleen/NewResiduals/Test/58514_TF03_mask10'};
in_dir_list
  

По сути, я просто распечатываю то, что есть in_dir_list , просто чтобы я мог видеть, что это работает.

Теперь, если я уже ssh подключился к компьютеру, на котором хочу выполнить обработку, и запускаю

 /Applications/MATLAB_R2017a.app/bin/matlab -r "cd /Test; try, run('/Test/TF03_MatLabCommands_and_results.m'); end; quit"
  

он выполняется так, как должен. Итак, я знаю, что команда UNIX верна.
Но если я запускаю первую команду, MATLAB не распознает, " ' " как это делает Python, и просто удаляет ' все вместе, поэтому команда, которая запускается в MATLAB, в конечном итоге становится

 cd /Test; try, run(/Test/TF03_MatLabCommands_and_results.m); end; quit
                    |
Error: Unexpected MATLAB operator.
  

Обратите внимание, что до и после M-файла и пути нет ' .

Я также знаю, что команда ssh также правильная, потому что ее выполнение до момента запуска команды в MATLAB также работает (это означает, что я могу подключиться к компьютеру по ssh и открыть MATLAB). И он пытается выполнить хотя бы команду, но из-за " ' " путаницы он не видит необходимого ' .

Как мне правильно экранировать кавычки?

Ответ №1:

Экранирование кавычек через несколько оболочек — это кошмар. В принципе, вы должны экранировать оба и ' символы, ведущие к \' :

 run(\'/Test/TF03_MatLabCommands_and_results.m\')
  

Но это зависит от того, какие оболочки используются, и как они анализируют строки, какую точную комбинацию escape-символов и кавычек вы получите в итоге.

Более простое решение — вообще избежать кавычек. В MATLAB,

 run('/Test/TF03_MatLabCommands_and_results.m')
  

это то же самое, что

 run Test/TF03_MatLabCommands_and_results.m
  

Последнее не требует кавычек, если в имени файла нет пробелов.

Комментарии:

1. Отлично, это сработало запустите Test/TF03_MatLabCommands_and_results. m Большое вам спасибо!!