@KirSupi

Как в процессе выполнения программы считывать вывод?

Задача такая:
Через exec.Command запускаю, например, script.py
script.py

import time

while True:
    time.sleep(3)
    print("...")


Далее надо считывать вывод программы и сохранять его в какой-нибудь буфер, чтоб потом с помощью отдельной функции его считывать по запросу

Проблема в том, что никак не могу разобраться с os.Pipe() и Reader/Writer
Сейчас у меня примерно такой код:
spoiler


cmd := exec.Command("python",  "script.py")
	pr, pw := io.Pipe()
	cmd.Stdout = pw
	bufReader = bufio.NewReader(pr)
	outputBuffer = bytes.NewBuffer([]byte{})
	go func() {
		for {
			b, err := bufReader.ReadByte()
			outputBuffer.WriteByte(b)
			if err != nil {
				if err == io.EOF {
					break
				} else {
					fmt.Println(err)
					os.Exit(1)
				}
			}
			pr.Close()
		}
	}()
	if err := cmd.Run(); err != nil {
		log.Println(err.Error())
	}


И отдельно просто беру outputBuffer.Bytes() по запросу
  • Вопрос задан
  • 75 просмотров
Решения вопроса 2
Все гораздо проще. Вы можете сразу в stdout подложить буфер и смотреть в него при необходимости
cmd := exec.Command("python", "script.py")
stdoutBuf := bytes.NewBuffer(nil)
cmd.Stdout = stdoutBuf
if err := cmd.Run(); err != nil {
	log.Println(err.Error())
}

fmt.Println(stdoutBuf.String())


Или еще проще, если вам нужны и stdout и stderr вместе:
cmd := exec.Command("python", "script.py")
res, err := cmd.CombinedOutput()
if err != nil {
	log.Fatal(err)
}
fmt.Println(string(res))
Ответ написан
@falconandy
Недавно был подобный вопрос https://qna.habr.com/q/1218124, может вам подойдет мой ответ там.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы