Помещение "Ctrl-A" в скрипт оболочки Python - PullRequest
1 голос
/ 12 июля 2011

Я пытаюсь написать сценарий оболочки на Python для автоматизации процесса, но одна из команд, которые мне нужно использовать, это Ctrl + A (я использую экран).Есть ли способ кодировать это в сценарий?

Ответы [ 5 ]

1 голос
/ 12 июля 2011

В скрипте bash я могу сделать что-то вроде:

if [-n "$STY"]; then
    screen -X command
fi

То есть экран устанавливает $ STY, посмотрите, установлен ли он, чтобы определить, находитесь ли вы на экране. Затем отправьте команду, которую вы хотите, используя -X флаг экрана. Вы можете легко сделать то же самое в Python.

На самом деле, похоже, что screen -X command просто беззвучно выдает ошибки, если не на экране, так что вы даже можете использовать его без проверки на $STY

Gnu-Screen: запустить скрипт, который отправляет команды сеансу экрана, в котором он запускается

1 голос
/ 12 июля 2011

Нет. Вы не сможете управлять screen программой, если в ней запущена программа / скрипт python .

0 голосов
/ 07 августа 2013

Код ASCII для CTRL_A равен 1. Так что следующий код Python будет работать.

    CTRL_A = chr(1)
0 голосов
/ 13 июля 2011

Хорошо, это будет сложно. Как комментирует Пабло Санта-Крус, ваш сценарий запускает в пределах сеанса экрана, поэтому обычный интерфейс stdin / stdout / stderr с миром не будет работать, так как экран не слушает Ctrl-A на любой из этих ручек.

Но еще не все потеряно. Экран - это , прослушивание Ctrl-A на , это stdin, то есть, как клавиша Ctrl-A вашей клавиатуры достигает вас. (Ниже предполагается, что Linux, но я почти уверен, что другие Unices имеют что-то похожее ...) Во-первых, вашему сценарию необходимо выяснить pid своего родительского сеанса экрана (библиотека psutil может помочь) , Затем вы обнаружите, что каталог /proc/{pid}/fd содержит файлы, соответствующие filenos всех файловых дескрипторов, открытых этим процессом. Для обычных процессов Unix '0' - это стандартный вывод, '1' - это стандартный вывод, '2' - это stderr. При условии правильных разрешений пользователя ваш скрипт должен открывать /proc/{pid}/fd/0 и записывать в файл Ctrl-A, имитируя нажатие клавиши пользователем.

Я не совсем уверен, будет ли это работать , никогда раньше не пробовал, но если вам придется управлять экраном из подпроцесса, какой-то вариант этого, вероятно, будет вашим лучшим выбором.

0 голосов
/ 12 июля 2011

Модуль Python curses может вам помочь.:)

...