Python 3 эквивалентен команде Bash "read -rs -t1 -n1", чтобы опрашивать / ждать символа от пользователя? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть сценарии для оценки / тестирования оборудования, которые переросли Bash и переходят на Python 3. Все идет отлично, за исключением одного камня преткновения: у меня возникают проблемы с поиском замены Python для команды read -rs -t1 -n1 Bash, который ждет до секунды, пока наберется символ, прежде чем вернуться, который я использую для фоновых проверок безопасности оборудования (например, «он еще в огне?») и отображения счетчика во время ожидания ввода пользователя.

Однако у меня проблемы с поиском "питонической" замены. Самое близкое, что я нашел, это Rosetta Code и здесь, на StackExchange , которые кажутся слишком низкими.

Ключевым отсутствующим элементом, по-видимому, является отсутствие у Python высокоуровневой возможности выполнять неблокирующее чтение из stdin на уровне команды read Bash.

Требуется межплатформенная (Win / Mac / Lin) функциональность, но пока подойдет только GNU / POSIX / Linux.

Существует ли стандартный высокоуровневый способ сделать это в Python 3?

1 Ответ

2 голосов
/ 07 мая 2019

Попробовав несколько пакетов, помимо упомянутых в вопросе (например, пакет stdin ), я наконец решил вернуться к тому, с чего начал:

def bash_read(optstr="-rs -t1 -n1"):
    child = subprocess.Popen(["bash", "-c", "if read {}; then echo -n \"$REPLY\"; fi".format(optstr)], stdout=subprocess.PIPE)
    reply = child.communicate()[0]  # stdout content
    return reply

Для параметра optstr по умолчанию заданы параметры Bash read, которые я обычно использую, однако другие параметры могут быть заменены по желанию.

Вышеуказанная функция упрощает перемещение моих сценариев на Python.Но действительно ли это Pythonic?Ну да!В смысле использования правильного инструмента для работы.

Вышесказанное упрощается, когда 3.7 попадает в дистрибутивы, для чего требуется всего один вызов subprocess.run(), чтобы получить код возврата и текст изстандартный вывод команды и стандартный вывод.

...