вот моя проблема: мне нужно выполнить команду cmd из python, команда не выполняется быстро, она будет выполняться в течение более длительного периода времени. Что мне нужно, так это способ #1 выполнить команду и #2 получить непрерывный вывод этой команды.
Пример вывода:
какой-то текст... (затем примерно полминуты ожидания)
еще какой-то текст... (ожидание некоторое время)
еще текст...
Вы поняли, вывод происходит примерно каждые 30 секунд. Мне нужно поймать все выходы и что-то с ними сделать. Есть ли способ сделать это?
Я знаю, что могу выполнить команду с помощью os.system('command'), но я изо всех сил пытаюсь найти способ прочитать вывод!
Простое решение приведено в этот ответ. В питоне 3 это будет примерно так:
#!/usr/bin/env python3
import subprocess
proc = subprocess.Popen('./your_process', stdout=subprocess.PIPE)
while True:
line = proc.stdout.readline()
if not line:
break
else:
# Do whathever you need to do with the last line written on
# stdout by your_process
print("doing some stuff with...", line)
print("done for this line!")
конечно, вам все равно нужно учитывать, как процесс-производитель буферизует stdout
, то есть, если подпроцесс что-то вроде
#include <stdio.h>
#include <unistd.h>
int main()
{
for (int i = 1; i < 10000000; i++) {
printf("ping");
sleep(1);
}
}
потребительский скрипт просто прочитает много «пингов» вместе (что можно решить с помощью fflush(stdout)
в цикле).
Гораздо более сложное решение можно найти в этот ответ.
Посмотрите на модуль
subprocess
. Это немного крутая кривая обучения, но выполнение того, что вы хотите, имеет больше вариаций, чем вы ожидаете.os.system()
считается устаревшим почти 20 лет (начиная с Python 2.4), одной из причин которого является проблема, с которой вы столкнулись.