Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 4, 2015 17:24:49

Maeshae3
Зарегистрирован: 2015-11-04
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

Стоит такая задача:
Из эмулятора терминала запущен скрипт на python. В скрипте запущен процесс
через subprocess который реагирует на нажатие клавиш. Но физически я не могу
этого сделать. Эмулятор терминала скрыт. И вообще их много запущено.
Есть ли способ имитировать нажатие клавиши и послать его процессу? Я даже не знаю с какой стороны подступиться.

Отредактировано Maeshae3 (Ноя. 4, 2015 20:14:08)

Офлайн

#2 Ноя. 4, 2015 22:21:24

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

Maeshae3
Я даже не знаю с какой стороны подступиться.
С изучения того что означают аргументы strdin stdout stderr в subprocess.Popen. На этом пути вас ожидают проблемы с буферизацией команд. Может быть полезен модуль pexpect.



Отредактировано doza_and (Ноя. 4, 2015 22:22:41)

Офлайн

#3 Ноя. 4, 2015 22:38:24

Maeshae3
Зарегистрирован: 2015-11-04
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

doza_and
Может быть полезен модуль pexpect

1) Каким боком здесь pexpect? “пальцем в небо”

2) Я знаю что такое ввод-вывод а так-же communicate. И как же это мне поможет?

Запущенный в скрипте процесс это сторонняя программа. Послать ей сигнал можно (и нужно) только из другого скрипта. Я могу отловить процесс при помощи grep или pgrep.
Но это мало что даёт т.к. запущенная программа даёт вывод на терминал и ждёт ввода клавиатурных команд.

Наверное я не очень понятно вопрос задал, Скрипт на питоне запускает стороннюю программу и добавляет ей функционал. Дальше программа работает как всякая консольная утилита и работает долго. А второй скрипт нужен для автоматизации управления. Запланировал задание и не надо у терминала сидеть.

Отредактировано Maeshae3 (Ноя. 4, 2015 22:54:45)

Офлайн

#4 Ноя. 4, 2015 22:58:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

Maeshae3
Запланировал задание и не надо у терминала сидеть.
Ну может я что-то не понимаю. Я как раз для управления сторонними долгоиграющими программами и использую pexpect и потоки ввода вывода.
Большинство консольных утилит, которые ждут ввода пользователя получают его как раз из stdin пропихнув их туда можно рано или поздно заставить программу выполнить вашу команду. Или у вас система которая непосредственно мониторит прерывания от контроллера клавиатуры?

Давайте чтобы разобраться начнем с простой внешней программы.

#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)

Офлайн

#5 Ноя. 4, 2015 23:27:50

Maeshae3
Зарегистрирован: 2015-11-04
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

doza_and
Или у вас система которая непосредственно мониторит прерывания от контроллера клавиатуры?
Извините, но я не стал дальше читать. Программа ждёт именно нажатия клавиши.
Или сочетания клавиш. Я могу только переназначить в конфиге. Для того чтобы узнать как выглядит сама команда надо разобрать здоровенный сырец на С, и то не факт что найду.
Можно решить эту задачу на bash через какой нибудь key event.
Но неужели на питоне не сделать?

Можно ещё с разработчиками связаться и у них узнать команды. Но я не верю что нет реализации моей задачи на питоне.

Отредактировано Maeshae3 (Ноя. 4, 2015 23:37:32)

Офлайн

#6 Ноя. 4, 2015 23:59:20

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

Maeshae3
1) Каким боком здесь pexpect? “пальцем в небо”
Это помоему вы пальцем в небо тычете.

Pexpect is a pure Python module for spawning child applications; controlling them; and responding to expected patterns in their output. Pexpect works like Don Libes’ Expect. Pexpect allows your script to spawn a child application and control it as if a human were typing commands.

Вроде то что вы и хотите.
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()
Под разные ОС может потребоваться конечно доводка. Но на всех мне доступных работает.



Офлайн

#7 Ноя. 4, 2015 23:59:20

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

Maeshae3
1) Каким боком здесь pexpect? “пальцем в небо”
Это помоему вы пальцем в небо тычете.

Pexpect is a pure Python module for spawning child applications; controlling them; and responding to expected patterns in their output. Pexpect works like Don Libes’ Expect. Pexpect allows your script to spawn a child application and control it as if a human were typing commands.

Вроде то что вы и хотите.
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()
Под разные ОС может потребоваться конечно доводка. Но на всех мне доступных работает.



Офлайн

#8 Ноя. 5, 2015 00:55:53

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

doza_and
Объясните как с помощью предложенных вами вариантов отправить клиенту сигнал о нажатии клавиш Ctrl и L, клавиши + на дополнительной клавиатуре (там где NumLock) и тп.

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#9 Ноя. 5, 2015 01:08:48

Maeshae3
Зарегистрирован: 2015-11-04
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

JOHN_16
Если я правильно понял ТС, то нужно именно эумуляция нажатия клавиш клавиатуры
Да конечно, так и есть. Спасибо что поддержали.
subprocess не подходит. Нужен какой-то биндинг для эмуляции клавиатуры наверное. И послать в определённый /dev/pts/x из другого скрипта. Например есть какой-то pyatspi.
И наверняка ещё много всего есть. Не может не быть. Но прежде чем ставить не известные мне пакеты и биться головой о стену я решил спросить на форуме в надежде услышать мнение людей которые грамотнее меня.

Офлайн

#10 Ноя. 5, 2015 01:25:35

Maeshae3
Зарегистрирован: 2015-11-04
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Послать нажатие клавиши процессу.

doza_and
вот вам примерчик:
Спасибо Вам что пытаетесь помочь но я эти способы знаю. И во первых они не отправят буковку на нужный /dev/pts а во вторых в Линуксе для подобных вещей много всего, не надо ни каких скриптов писать. Но нужна не буковка.

Отредактировано Maeshae3 (Ноя. 5, 2015 09:54:31)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version