Использование subprocess.Popen()
вместо .call()
С Popen
вы также можете управлять стандартным вводом, стандартных выводом и 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() Проверьте, если дочерний процесс завершился. Установите и верните атрибут returncode .
Popen.wait() Дождитесь завершения дочернего процесса. Установите и верните атрибут returncode .
Popen.communicate (input = None) Взаимодействовать с процессом: Отправить данные на stdin. Чтение данных из stdout и stderr, пока не будет достигнут конец файла. Дождитесь завершения процесса. Необязательный входной аргумент должен быть строкой , которая будет отправлена дочернему процессу, или None, если данные не должны быть отправлены .
Многие подробнее in the docs
Однако как я получить ввод текста во внешнем приложении? –