Найти - Пользователи
Полная версия: Послать нажатие клавиши процессу.
Начало » Python для новичков » Послать нажатие клавиши процессу.
1 2
Maeshae3
Стоит такая задача:
Из эмулятора терминала запущен скрипт на python. В скрипте запущен процесс
через subprocess который реагирует на нажатие клавиш. Но физически я не могу
этого сделать. Эмулятор терминала скрыт. И вообще их много запущено.
Есть ли способ имитировать нажатие клавиши и послать его процессу? Я даже не знаю с какой стороны подступиться.
doza_and
Maeshae3
Я даже не знаю с какой стороны подступиться.
С изучения того что означают аргументы strdin stdout stderr в subprocess.Popen. На этом пути вас ожидают проблемы с буферизацией команд. Может быть полезен модуль pexpect.
Maeshae3
doza_and
Может быть полезен модуль pexpect

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

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

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

Наверное я не очень понятно вопрос задал, Скрипт на питоне запускает стороннюю программу и добавляет ей функционал. Дальше программа работает как всякая консольная утилита и работает долго. А второй скрипт нужен для автоматизации управления. Запланировал задание и не надо у терминала сидеть.
doza_and
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;
}
Такой программой вы без проблем управляете?
Maeshae3
doza_and
Или у вас система которая непосредственно мониторит прерывания от контроллера клавиатуры?
Извините, но я не стал дальше читать. Программа ждёт именно нажатия клавиши.
Или сочетания клавиш. Я могу только переназначить в конфиге. Для того чтобы узнать как выглядит сама команда надо разобрать здоровенный сырец на С, и то не факт что найду.
Можно решить эту задачу на bash через какой нибудь key event.
Но неужели на питоне не сделать?

Можно ещё с разработчиками связаться и у них узнать команды. Но я не верю что нет реализации моей задачи на питоне.
doza_and
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()
Под разные ОС может потребоваться конечно доводка. Но на всех мне доступных работает.
doza_and
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()
Под разные ОС может потребоваться конечно доводка. Но на всех мне доступных работает.
JOHN_16
doza_and
Объясните как с помощью предложенных вами вариантов отправить клиенту сигнал о нажатии клавиш Ctrl и L, клавиши + на дополнительной клавиатуре (там где NumLock) и тп.

Если я правильно понял ТС, то нужно именно эумуляция нажатия клавиш клавиатуры, а не байтовые последователности которые принимаются через stdin поток.
Maeshae3
JOHN_16
Если я правильно понял ТС, то нужно именно эумуляция нажатия клавиш клавиатуры
Да конечно, так и есть. Спасибо что поддержали.
subprocess не подходит. Нужен какой-то биндинг для эмуляции клавиатуры наверное. И послать в определённый /dev/pts/x из другого скрипта. Например есть какой-то pyatspi.
И наверняка ещё много всего есть. Не может не быть. Но прежде чем ставить не известные мне пакеты и биться головой о стену я решил спросить на форуме в надежде услышать мнение людей которые грамотнее меня.
Maeshae3
doza_and
вот вам примерчик:
Спасибо Вам что пытаетесь помочь но я эти способы знаю. И во первых они не отправят буковку на нужный /dev/pts а во вторых в Линуксе для подобных вещей много всего, не надо ни каких скриптов писать. Но нужна не буковка.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB