Python - запустить процесс и ждать вывода - PullRequest
0 голосов
/ 09 июня 2018

Я хочу запустить программу, дождаться ее вывода, отправить в нее входные данные и повторить до выполнения условия.

Все, что я мог найти, это вопросы о ожидании завершения программы, но это НЕ так.Процесс все еще будет запущен, он просто не даст никаких (новых) выходных данных.

Вывод программы осуществляется в стандартный вывод и в файл журнала, может использоваться любой из них.
Использование linux.

Код на данный момент:

import subprocess

flag = True
vsim = subprocess.popen(['./run_vsim'], 
                        stdin=subprocess.pipe,
                        shell=true, 
                        cwd='path/to/program')
while flag:
    with open(log_file), 'r') as f:
        for l in f:
            if condition:
                break
    vsim.stdin.write(b'do something\n')
    vsim.stdin.flush()
vsim.stdin.write(b'do something else\n')
vsim.stdin.flush()

Как есть,ввод «сделать что-то» отправляется несколько раз даже до завершения программы.Кроме того, файл журнала читается до того, как программа завершит выполнение команды из последней во время итерации.Это заставляет его буферизовать входные данные, поэтому я продолжаю выполнять команды даже после того, как условие выполнено.

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Если вы используете python3, вы можете попробовать обновить свой код, чтобы использовать вместо него subprocess.run.Следует подождать, пока ваша задача завершится и вернет вывод.

0 голосов
/ 09 июня 2018

Вы можете использовать команды вместо подпроцесса.Вот пример с командой ls:

import commands 
status_output = commands.getstatusoutput('ls ./')
print status_output[0] #this will print the return code (0 if everything is fine)
print status_output[1] #this will print the output (list the content of the current directory)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...