Похоже, что что-то не так с вашей конфигурацией, вот несколько вещей, которые вы можете проверить:
php -v
из командной строки и посмотреть, возвращает ли информация о версии или какие-либо ошибки. LoadModule php5_module "c:/php/php5apache2_2.dll"
в файле. Найдите LoadModule php
и убедитесь, что перед ним нет комментария (;
). AddType application/x-httpd-php .php
. Это говорит Apache, чтобы запустить .php
файлы как PHP. Найдите AddType, а затем убедитесь, что есть запись для PHP, и что она раскоментирована. .php
на нем или любое расширение, указанное в определении MIME в point # 3, иначе он не будет выполняться как PHP.
), это не включен на всех серверах по умолчанию, и их использование не рекомендуется. Вместо этого используйте (или включить короткие теги в вашем php.ini с short_open_tag=On
, если у вас есть код, который их использует).
http://localhost/file.php
, не через доступ к локальному файлу file://localhost/www/file.php
И, наконец, проверьте Руководство по PHP для дальнейших советов по настройке .
Существует способ использования Java из Matlab, в частности класса java.awt.Robot
. См. здесь .
По-видимому, существуют два типа программ, касающихся того, как они работают при вызове из Matlab с system('...')
:
WinRAR
(по крайней мере, на моей машине с Windows 7). 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
Если ваши приложения находятся только на платформе 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 можно найти здесь здесь
system
Matlab, а не классом Java robot
. В любом случае мне удалось избежать этих ограничений, используя `& amp;` при вызове system
. Я вижу, вы также используете это, и ваше решение действительно работает в моей системе. +1
– Luis Mendo
16 January 2015 в 23:28
&
был хитростью для выпуска запущенной программы самостоятельно (, не получив раздражающего сообщения об ошибке Matlab, в котором говорится, что программа не будет принимать события Windows i>). Я говорил о тех же ограничениях, потому что я подозреваю, что java-робот и объект .net используют один и тот же вызов API Windows. Поэтому, если одно решение работает для нераскрытой программы OP, другая тоже будет работать (и, к сожалению, наоборот). Но я просто размышляю здесь, давайте подождем отзывы от OP.
– Hoki
16 January 2015 в 23:44
.net
... они будут работать только в Windows, а реализация java
будет работать и в Linux.
– Hoki
17 January 2015 в 00:30
&
, у вас уже был ответ с этим
– Luis Mendo
17 January 2015 в 12:31
Если вам нужно запустить консольную программу в контексте, который разрешает полное перенаправление DOS, вы можете создать файл, называемый, например, CR.txt, содержащий возврат каретки, и использовать '& lt;' нотация для передачи значения в программу.
Это работает только в том случае, если вы можете обеспечить ввод всех входных данных клавиатуры в файл. Он терпит неудачу, если входной сигнал должен меняться в зависимости от ответов.
Альтернативой является дублирование потока (и, возможно, вывода) для программы, а затем вывод данных в программу и выход из нее. Это более устойчиво и позволяет динамические ответы на данные, но также, вероятно, потребует значительных усилий для внедрения пользователя робота в приложение.
Rog-O-Matic является пример большого приложения, полностью контролируемого программой, которая контролирует вывод экрана и имитирует ввод с клавиатуры, чтобы играть в графическую приключенческую игру ASCII (1980-е годы).
Другие ответы потребуются для приложений на основе графического интерфейса пользователя.
Существует небольшая утилита javascript, которая имитирует нажатия клавиш, подобных этому в интерпретаторе javascript Windows.
Просто создайте файл js со следующим кодом:
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.SendKeys(WScript.Arguments(0));
, затем вызовите его из Matlab после необходимого таймаута:
system('c:\my\js\file\script.js {Enter}');
Не могу проверить здесь сейчас, но я думаю, что это должно работать ...
Robot
работал ... Этот кажется чище ...
– reverse_engineer
20 January 2015 в 19:48
Пакет 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.