Форум сайта python.su
0
Стоит такая задача:
Из эмулятора терминала запущен скрипт на python. В скрипте запущен процесс
через subprocess который реагирует на нажатие клавиш. Но физически я не могу
этого сделать. Эмулятор терминала скрыт. И вообще их много запущено.
Есть ли способ имитировать нажатие клавиши и послать его процессу? Я даже не знаю с какой стороны подступиться.
Отредактировано Maeshae3 (Ноя. 4, 2015 20:14:08)
Офлайн
253
Maeshae3С изучения того что означают аргументы strdin stdout stderr в subprocess.Popen. На этом пути вас ожидают проблемы с буферизацией команд. Может быть полезен модуль pexpect.
Я даже не знаю с какой стороны подступиться.
Отредактировано doza_and (Ноя. 4, 2015 22:22:41)
Офлайн
0
doza_and
Может быть полезен модуль pexpect
Отредактировано Maeshae3 (Ноя. 4, 2015 22:54:45)
Офлайн
253
Maeshae3Ну может я что-то не понимаю. Я как раз для управления сторонними долгоиграющими программами и использую pexpect и потоки ввода вывода.
Запланировал задание и не надо у терминала сидеть.
#include <iostream> #include <iomanip> using namespace std; int main() { char ch; while(1) { ch = cin.get(); cout.put(ch); if(ch=='s') break; } return 0; }
Отредактировано doza_and (Ноя. 4, 2015 23:26:41)
Офлайн
0
doza_andИзвините, но я не стал дальше читать. Программа ждёт именно нажатия клавиши.
Или у вас система которая непосредственно мониторит прерывания от контроллера клавиатуры?
Отредактировано Maeshae3 (Ноя. 4, 2015 23:37:32)
Офлайн
253
Maeshae3Это помоему вы пальцем в небо тычете.
1) Каким боком здесь pexpect? “пальцем в небо”
Maeshae3вот вам примерчик:
И как же это мне поможет?
import subprocess as sp prc=sp.Popen("a.exe",stdin=sp.PIPE,stdout=sp.PIPE,bufsize=1, universal_newlines=True) prc.stdin.write("y") prc.stdin.flush() print prc.stdout.read(1) prc.stdin.write("z") prc.stdin.flush() print prc.stdout.read(1) prc.stdin.write("s") prc.stdin.flush() print prc.stdout.read()
Офлайн
253
Maeshae3Это помоему вы пальцем в небо тычете.
1) Каким боком здесь pexpect? “пальцем в небо”
Maeshae3вот вам примерчик:
И как же это мне поможет?
import subprocess as sp prc=sp.Popen("a.exe",stdin=sp.PIPE,stdout=sp.PIPE,bufsize=1, universal_newlines=True) prc.stdin.write("y") prc.stdin.flush() print prc.stdout.read(1) prc.stdin.write("z") prc.stdin.flush() print prc.stdout.read(1) prc.stdin.write("s") prc.stdin.flush() print prc.stdout.read()
Офлайн
221
doza_and
Объясните как с помощью предложенных вами вариантов отправить клиенту сигнал о нажатии клавиш Ctrl и L, клавиши + на дополнительной клавиатуре (там где NumLock) и тп.
Если я правильно понял ТС, то нужно именно эумуляция нажатия клавиш клавиатуры, а не байтовые последователности которые принимаются через stdin поток.
Офлайн
0
JOHN_16Да конечно, так и есть. Спасибо что поддержали.
Если я правильно понял ТС, то нужно именно эумуляция нажатия клавиш клавиатуры
Офлайн
0
doza_andСпасибо Вам что пытаетесь помочь но я эти способы знаю. И во первых они не отправят буковку на нужный /dev/pts а во вторых в Линуксе для подобных вещей много всего, не надо ни каких скриптов писать. Но нужна не буковка.
вот вам примерчик:
Отредактировано Maeshae3 (Ноя. 5, 2015 09:54:31)
Офлайн