Запуск os.execute для получения вывода

Я использую следующий код, который запускает команду для двоичного файла и должен предоставить вывод

если я запустил команду ftr get apps в своем Mac, я получил

[app1 apps2]

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

    Cmd := exec.Command("ftr", "get", "apps")
    Cmd.Dir = "./testdata/"
    err := Cmd.Start()
    fmt.Println(err)
    bytes, e := Cmd.Output()
    fmt.Println(bytes, e)
golang.org/pkg/os/exec/#Cmd.Run
mh-cbon 04.11.2018 08:56

Возможный дубликат Как получить вывод из stdout в строку в golang

Vorsprung 04.11.2018 12:46
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
2
150
2

Ответы 2

У вас не будет прямого вывода, поскольку командам требуется некоторое время, прежде чем они будут записаны в stdout / stderr, поэтому вам нужно в основном подождать, пока что-то выйдет.

Это можно сделать с помощью bufio.NewScanner, например:

package main

import (
    "bufio"
    "fmt"
    "os/exec"
    "strings"
)

func main() {
    args := "get apps"
    cmd := exec.Command("ftr", strings.Split(args, " ")...)
    cmd.Dir = "./testdata/"

    stdout, _ := cmd.StdoutPipe()
    cmd.Start()

    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanWords)

    for scanner.Scan() {
        m := scanner.Text()
        fmt.Println(m)
    }

    cmd.Wait()
}

Если ваша команда записывает на stderr вместо stdout, вам может потребоваться использовать cmd.StderrPipe вместо cmd.Stdoutpipe для получения вывода.

Привет, почему ждать после for scanner ? for не должно быть после ожидания?

user4445419 03.11.2018 21:50

и можно как-нибудь получить все значение в 1 строку?

user4445419 03.11.2018 21:56

Вы можете добавить к строке

poy 03.11.2018 23:59

Этот код никогда не должен завершаться. scanner.Scan возвращает истину до закрытия считывателя, но считыватель не закрывается до тех пор, пока не будет вызван Wait.

Peter 04.11.2018 10:39

Вызов как Start, так и Output является избыточным.

Output runs the command and returns its standard output.

Start используется для асинхронного выполнения команды. Просто удалите этот вызов:

    cmd := exec.Command("ftr", "get", "apps")
    cmd.Dir = "./testdata/"
    b, err := cmd.Output()
    fmt.Println(string(b), err)

Другие вопросы по теме