Прерывание stdout подпроцесса, в то время как это работает

Если вы понимаете, что делать что-то подобное следует делать то, что вы хотите:

import random
from pynput.keyboard import Key, Controller

keyboard = Controller()

def press_release_char(char):
    keyboard.press(char)
    keyboard.release(char)

press_release_char(str(random.randint(0,9)))
press_release_char(Key.enter)

На основании документации pynput https://pynput.readthedocs.io/en/latest/keyboard .html # control-the-keyboard

Вы можете добавить цикл вокруг строки press_release_char(str(random.randint(0,9))) для нескольких цифр

23
задан Peter Mortensen 11 December 2010 в 14:11
поделиться

2 ответа

Как Charles уже упомянул, проблема буферизует. Я работал в к подобной проблеме при записи некоторых модулей для SNMPd и решил его путем замены stdout с версией автосбрасывания.

я использовал следующий код, вдохновленный некоторыми сообщениями на ActiveState:

class FlushFile(object):
    """Write-only flushing wrapper for file-type objects."""
    def __init__(self, f):
        self.f = f
    def write(self, x):
        self.f.write(x)
        self.f.flush()

# Replace stdout with an automatically flushing version
sys.stdout = FlushFile(sys.__stdout__)
15
ответ дан Kamil Kisiel 29 November 2019 в 02:53
поделиться

Вывод процесса буферизуется. В большем количестве операционных систем UNIXy (или Cygwin), модуль pexpect доступен, который рассказывает все необходимые заклинания для предотвращения связанных с буферизацией проблем. Однако эти заклинания требуют работы модуль имущества , который не доступен на собственном компоненте (non-cygwin) сборки win32 Python.

В случае в качестве примера, где Вы управляете подпроцессом, у Вас может просто быть он вызов sys.stdout.flush(), в случае необходимости - но для произвольных подпроцессов, та опция не доступна.

Видят также вопрос, "Почему не только используют канал (popen ())?" в pexpect FAQ.

8
ответ дан Charles Duffy 29 November 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: