Дать команды для внешней программы в matlab [duplicate]

Похоже, что что-то не так с вашей конфигурацией, вот несколько вещей, которые вы можете проверить:

  1. Убедитесь, что PHP установлен и работает правильно. Это может показаться глупым, но вы никогда не знаете. Простой способ проверить - запустить php -v из командной строки и посмотреть, возвращает ли информация о версии или какие-либо ошибки.
  2. Убедитесь, что модуль PHP указан и раскомментирован внутри вашего httpd.conf Apache. должно быть что-то вроде LoadModule php5_module "c:/php/php5apache2_2.dll" в файле. Найдите LoadModule php и убедитесь, что перед ним нет комментария (;).
  3. Убедитесь, что в файле httpd.conf Apache есть PHP MIME-тип. Это должно быть что-то вроде AddType application/x-httpd-php .php. Это говорит Apache, чтобы запустить .php файлы как PHP. Найдите AddType, а затем убедитесь, что есть запись для PHP, и что она раскоментирована.
  4. Убедитесь, что ваш файл имеет расширение .php на нем или любое расширение, указанное в определении MIME в point # 3, иначе он не будет выполняться как PHP.
  5. Убедитесь, что вы не используете короткие теги в файле PHP (), это не включен на всех серверах по умолчанию, и их использование не рекомендуется. Вместо этого используйте (или включить короткие теги в вашем php.ini с short_open_tag=On, если у вас есть код, который их использует).
  6. Убедитесь, что вы обращаетесь к своему файлу через ваш веб-сервер, используя URL-адрес, такой как http://localhost/file.php, не через доступ к локальному файлу file://localhost/www/file.php

И, наконец, проверьте Руководство по PHP для дальнейших советов по настройке .

22
задан Amro 17 January 2015 в 05:05
поделиться

5 ответов

Существует способ использования Java из Matlab, в частности класса java.awt.Robot. См. здесь .

По-видимому, существуют два типа программ, касающихся того, как они работают при вызове из Matlab с system('...'):

  1. Для некоторые программы, Matlab ждут , пока программа не завершит работу перед запуском следующего оператора. Это происходит, например, с WinRAR (по крайней мере, на моей машине с Windows 7).
  2. Для других программ этого не происходит, и Matlab переходит к следующим оператором сразу после внешняя программа была запущена. Примером такого типа является explorer (стандартный проводник файлов Windows).

Теперь можно сразу же запустить выполнение в Matlab даже для программ типа 1: просто добавьте & в конце строки, переданной в system. Это стандарт в оболочке Linux Bash , и он также работает в Windows, как обсуждалось здесь здесь .

Итак, вы будете действовать следующим образом:

robot = java.awt.Robot;
command = '"C:\Program Files (x86)\WinRAR\WinRAR"'; %// external program; full path
system([command ' &']); %// note: ' &' at the end
pause(5) %// allow some time for the external program to start
robot.keyPress (java.awt.event.KeyEvent.VK_ENTER); %// press "enter" key
robot.keyRelease (java.awt.event.KeyEvent.VK_ENTER); %// release "enter" key
25
ответ дан Luis Mendo 21 August 2018 в 14:02
поделиться

Если ваши приложения находятся только на платформе Windows, вы можете попробовать использовать объекты .net.

Метод SendWait объектов SendKeys позволяет отправлять виртуально любой ключ или комбинацию клавиш для приложения, которое имеет фокус, включая клавиши «модификатора», такие как Alt, Shift, Ctrl и т. д. ...

Первое, что нужно сделать, это импортировать .net библиотеке, то полный синтаксис для отправки ключа ENTER будет выглядеть следующим образом:

NET.addAssembly('System.Windows.Forms');
System.Windows.Forms.SendKeys.SendWait('{ENTER}'); %// send the key "ENTER"

Если вы делаете это только после полного синтаксиса. Если вы планируете широко использовать команду, вы можете помочь себе с помощью анонимной вспомогательной функции.

Маленький пример с записью

%% // import the .NET assembly and define helper function
NET.addAssembly('System.Windows.Forms');
sendkey = @(strkey) System.Windows.Forms.SendKeys.SendWait(strkey) ;

%% // prepare a few things to send to the notepad
str1 = 'Hello World' ;
str2 = 'OMG ... my notepad is alive' ;
file2save = [pwd '\SelfSaveTest.txt'] ;
if exist(file2save,'file')==2 ; delete(file2save) ; end %// this is just in case you run the test multiple times.

%% // go for it
%// write a few things, save the file then close it.
system('notepad &') ;   %// Start notepad, without matlab waiting for the return value
sendkey(str1)           %// send a full string to the notepad
sendkey('{ENTER}');     %// send the {ENTER} key
sendkey(str2)           %// send another full string to the notepad
sendkey('{! 3}');       %// note how you can REPEAT a key send instruction
sendkey('%(FA)');       %// Send key combination to open the "save as..." dialog
pause(1)                %// little pause to make sure your hard drive is ready before continuing
sendkey(file2save);     %// Send the name (full path) of the file to save to the dialog
sendkey('{ENTER}');     %// validate
pause(3)                %// just wait a bit so you can see you file is now saved (check the titlebar of the notepad)
sendkey('%(FX)');       %// Bye bye ... close the Notepad

Как объясняется в Документация Microsoft для класса SendKeys иногда может иметь некоторые проблемы с синхронизацией, поэтому, если вы хотите выполнять сложные манипуляции (например, Tab несколько раз, чтобы изменить кнопку, которую вы на самом деле хотите нажать), вам может потребоваться ввести pause в ваших ответах Matlab на SendKeys.

Попробуйте без первого, но не забывайте, что вы управляете процессом от другого без какой-либо синхронизации между ними, поэтому выберите все, что может потребовать немного проб и ошибок, прежде чем вы это исправите, по крайней мере для сложных последовательностей (простой должен быть простым).

В моем случае выше, например, я запускаю все свои данные с внешнего жесткого диска с функция ECO, которая переводит ее в режим ожидания, поэтому, когда я называю диалоговое окно «Сохранить как ...», для его отображения требуется время, потому что HDD должен проснуться. Если я не представил pause(1), иногда путь к файлу был бы незавершенным (первая часть пути была отправлена ​​до того, как диалог имел фокус) .


Также , не забудьте символ & при выполнении внешней программы. Все заслуги Луиса Мендо за его выделение. (Я стараюсь забыть, насколько это важно, потому что я использую его по умолчанию.Я только опускаю его, если мне нужно специально ожидать возврата от программы, в противном случае я позволяю ему работать самостоятельно )


Специальные символы имеют специальный код. Вот несколько:

Shift          +
Control (Ctrl)  ^
Alt            %

Tab            {TAB}
Backspace      {BACKSPACE}, {BS}, or {BKSP}
Validation     {ENTER} or ~ (a tilde)
Ins Or Insert  {INSERT} or {INS}
Delete         {DELETE} or {DEL}

Text Navigation {HOME} {END} {PGDN} {PGUP}
Arrow Keys      {UP} {RIGHT} {DOWN} {LEFT}

Escape          {ESC}
Function Keys   {F1} ... {F16}
Print Screen    {PRTSC}
Break           {BREAK}

Полный список из Microsoft можно найти здесь здесь

13
ответ дан Community 21 August 2018 в 14:02
поделиться
  • 1
    Ограничения в моем ответе были вызваны командой system Matlab, а не классом Java robot. В любом случае мне удалось избежать этих ограничений, используя `& amp;` при вызове system. Я вижу, вы также используете это, и ваше решение действительно работает в моей системе. +1 – Luis Mendo 16 January 2015 в 23:28
  • 2
    @LuisMendo. Да, & был хитростью для выпуска запущенной программы самостоятельно (, не получив раздражающего сообщения об ошибке Matlab, в котором говорится, что программа не будет принимать события Windows ). Я говорил о тех же ограничениях, потому что я подозреваю, что java-робот и объект .net используют один и тот же вызов API Windows. Поэтому, если одно решение работает для нераскрытой программы OP, другая тоже будет работать (и, к сожалению, наоборот). Но я просто размышляю здесь, давайте подождем отзывы от OP. – Hoki 16 January 2015 в 23:44
  • 3
    @LuisMendo, на самом деле, думая об этом, если у кого-то больше ограничений, это будут объекты .net ... они будут работать только в Windows, а реализация java будет работать и в Linux. – Hoki 17 January 2015 в 00:30
  • 4
    Да, должно. Я не могу это проверить, хотя – Luis Mendo 17 January 2015 в 00:46
  • 5
    Вы также заслуживаете признания за &, у вас уже был ответ с этим – Luis Mendo 17 January 2015 в 12:31

Если вам нужно запустить консольную программу в контексте, который разрешает полное перенаправление DOS, вы можете создать файл, называемый, например, CR.txt, содержащий возврат каретки, и использовать '& lt;' нотация для передачи значения в программу.

Это работает только в том случае, если вы можете обеспечить ввод всех входных данных клавиатуры в файл. Он терпит неудачу, если входной сигнал должен меняться в зависимости от ответов.

Альтернативой является дублирование потока (и, возможно, вывода) для программы, а затем вывод данных в программу и выход из нее. Это более устойчиво и позволяет динамические ответы на данные, но также, вероятно, потребует значительных усилий для внедрения пользователя робота в приложение.

Rog-O-Matic является пример большого приложения, полностью контролируемого программой, которая контролирует вывод экрана и имитирует ввод с клавиатуры, чтобы играть в графическую приключенческую игру ASCII (1980-е годы).

Другие ответы потребуются для приложений на основе графического интерфейса пользователя.

3
ответ дан Pekka 21 August 2018 в 14:02
поделиться

Существует небольшая утилита javascript, которая имитирует нажатия клавиш, подобных этому в интерпретаторе javascript Windows.

Просто создайте файл js со следующим кодом:

var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.SendKeys(WScript.Arguments(0));

, затем вызовите его из Matlab после необходимого таймаута:

system('c:\my\js\file\script.js {Enter}');

Не могу проверить здесь сейчас, но я думаю, что это должно работать ...

3
ответ дан reverse_engineer 21 August 2018 в 14:02
поделиться
  • 1
    @bla Извините, не заметил, что ответ Robot работал ... Этот кажется чище ... – reverse_engineer 20 January 2015 в 19:48
  • 2
    @bla Вы пробовали мое решение? Сбой тоже? – reverse_engineer 30 June 2015 в 16:04

Пакет Python pywinauto может ждать любого диалога и автоматически нажимать кнопки. Но он способен только для родных и некоторых .NET-приложений. У вас могут быть проблемы с нажатием кнопки WPF (возможно, кнопка QT доступна для клика - не проверяется), но в этом случае код, например app.DialogTitle.Wait('ready').SetFocus(); app.DialogTitle.TypeKeys('{ENTER}'), может помочь. Ваш случай довольно прост и, вероятно, достаточно нескольких трюков с pywinauto. У вашего «приложения с всплывающими» 64-битными или 32-битными функциями

Wait и WaitNot есть параметр timeout . Но если вам нужен точно прослушиватель с потенциально бесконечным циклом, ожидающим всплывающие окна, хорошее направление - глобальные крючки Windows ( pyHook может прослушивать события мыши и keybd, но не может слушать диалог открытия). Я попытаюсь найти мой прототип, который сможет обнаружить новые окна. Он использует обработчики событий API UI Automation ... и ... ops ... для этого требуется IronPython. Я до сих пор не знаю, как настроить обработчик UI Automation с COM-интерфейсом со стандартного CPython.

2
ответ дан Vasily Ryabov 21 August 2018 в 14:02
поделиться
  • 1
    Официальный pywinauto 0.4.2 поддерживает только 32-разрядные Python и 32-разрядные приложения. Вот почему я спрашиваю о битте. Но для простого нажатия клавиши этого может быть достаточно. Просто учтите это, если что-то не с 64-битным. В Интернете есть 64-битные совместимые клоны. – Vasily Ryabov 17 January 2015 в 23:26
  • 2
    Java также не является Matlab (см. Первый ответ). Python из MatLAB: mathworks.com/help/matlab/call-python-libraries.html Java от MatLAB: mathworks.com/help/matlab/using-java-libraries-in-matlab .html В чем принципиальная разница? – Vasily Ryabov 20 January 2015 в 09:47
  • 3
    Одно отличие состоит в том, что Matlab поддерживает Java изначально, тогда как для запуска Python из Matlab вам необходимо установить поддерживаемую версию ссылочной реализации (CPython) для Python ". – Luis Mendo 20 January 2015 в 10:11
  • 4
    Я полностью осознаю свою разницу (отсюда мой золотой значок в MATLAB). Кроме того, ответ от @LuisMendo правильный, потому что MATLAB поддерживает Java изначально, поскольку движущей силой MATLAB является JRE. Ваш ответ не является конструктивным, так как требует установки CPython. OP хочет изначально сделать это в MATLAB без поддержки сторонних разработчиков. Тем не менее, я удалю свой downvote, поскольку OP может найти ответ полезным, но я не уверен, что сделаю. – rayryeng 20 January 2015 в 10:23
  • 5
    Хорошо, спасибо за подробное объяснение. Я не согласен с моим предложением. Но это не вне темы, просто еще один способ решить проблему. – Vasily Ryabov 20 January 2015 в 10:45
Другие вопросы по тегам:

Похожие вопросы: