Также следует отметить, что начиная с Python 2.6 встроенная функция open () теперь является псевдонимом для функции io.open (). Было даже рассмотрено удаление встроенного open () в Python 3 и требование использования io.open, чтобы избежать случайных конфликтов пространства имен, возникающих в результате таких вещей, как «from blah import *». В Python 2.6+ вы можете написать (и также можете считать этот стиль хорошей практикой):
import io
filehandle = io.open(sys.argv[1], 'r')
Если вам нужно запустить консольную программу в контексте, который разрешает полное перенаправление DOS, вы можете создать файл, скажем, CR.txt, содержащий возврат каретки, и использовать '<' нотация для передачи значения в программу.
Это работает только в том случае, если вы можете указать, что весь ввод с клавиатуры может быть записан в файл. Это терпит неудачу, если входные данные должны варьироваться в зависимости от ответов.
Альтернативой является дублирование входного (и, возможно, выходного) потока (ов) для программы, а затем передача данных в программу и из нее. Это более надежно и может позволить динамические ответы на данные, но также, вероятно, потребует значительных усилий для внедрения пользователя робота в приложение.
Rog-O-Matic является примером большого приложения, полностью управляемого программой, которая контролирует вывод на экран и имитирует ввод с клавиатуры, чтобы играть в раннюю (1980-е) графическую приключенческую игру ASCII.
Другие ответы потребуются для приложений на основе графического интерфейса.
Если ваши приложения работают только на платформе Windows, вы можете попробовать использовать .net
объекты.
Метод SendWait
объектов SendKeys
позволяет отправлять практически любую клавишу или комбинацию клавиш в приложение, которое имеет фокус, включая клавиши-модификаторы, такие как Alt kbd>, Shift kbd>, Ctrl kbd> и т. д.
Первое, что нужно сделать, это импортировать библиотеку .net
, тогда полный синтаксис для отправки ключа ENTER kbd> будет:
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 kbd> несколько раз, чтобы изменить кнопку, которую вы действительно хотите нажать), вам может потребоваться ввести 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 можно найти здесь