2012-05-31 3 views
2

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

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

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

ответ

6

Использование 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

+0

Однако как я получить ввод текста во внешнем приложении? –

Смежные вопросы