Как запустить и передать ввод во внешнюю программу

Я использую Python для выполнения внешней программы. И я также хотел бы, чтобы Python отправлял несколько нажатий клавиш вызываемой программе для завершения автоматического входа в систему.

Проблема в том, что когда я использовал subprocess.call() для выполнения внешней программы, программа получила системный фокус, и скрипт Python не смог ответить, пока я не закрыл внешнюю программу.

Ребята, у вас есть предложения по этому поводу? Большое спасибо.

1 ответ

Решение

Использование subprocess.Popen() вместо .call()

С Popen вы также можете управлять дескрипторами файлов stdin, stdout и stderr, поэтому вы можете взаимодействовать с внешней программой.

Глупый пример:

s = subprocess.Popen(command, stdout=subprocess.PIPE, 
                     stderr=subprocess.PIPE) # The script is not blocked here

# Wait to finish
while s.poll() is None: # poll() checks if process has finished without blocking
    time.sleep(1)
    ... # do something

# Another way to wait
s.wait() # This is blocking

if s.returncode == 0:
    print "Everything OK!"
else:
    print "Oh, it was an error"

Несколько полезных методов:

Popen.poll () Проверьте, завершен ли дочерний процесс. Установить и вернуть атрибут кода возврата.

Popen.wait () Ожидание завершения дочернего процесса. Установить и вернуть атрибут кода возврата.

Popen.communicate (input = None) Взаимодействовать с процессом: отправлять данные в stdin. Читайте данные из stdout и stderr, пока не будет достигнут конец файла. Подождите, пока процесс завершится. Необязательный входной аргумент должен быть строкой, которая будет отправлена ​​дочернему процессу, или None, если никакие данные не должны быть отправлены дочернему процессу.

Много больше информации в документах

Другие вопросы по тегам