Как запустить и передать ввод во внешнюю программу
Я использую 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, если никакие данные не должны быть отправлены дочернему процессу.
Много больше информации в документах