Как подключить XML-декодер к stdoutPipe () go exec - PullRequest
0 голосов
/ 29 июня 2018

У меня возникли проблемы с связью вещей здесь. Что я делаю неправильно?

package main

import (
    "encoding/xml"
    "fmt"
    "log"
    "os/exec"
)

func checkError(err error) {
    if err != nil {
        log.Fatalf("Error: %s", err)
    }
}

func metrics() {
    cmd := exec.Command(
        "nvidia-smi",
        "--query",
        "--xml-format")

    out, err := cmd.StdoutPipe()
    checkError(err)

    cmd.Start()

    defer cmd.Wait()

    go func() {
        var data interface{}
        dec := xml.NewDecoder(out)
        dec.Decode(&data)
        fmt.Printf("Data: %+v\n", data)
    }()

    //go io.Copy(os.Stdout, out)
}

func main() {
    metrics()
}

Результат после запуска программы: Данные:

1 Ответ

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

Вещи, кажется, "связаны" правильно.

Возможно, проблема здесь:

var data interface{}

Затем вы делаете:

dec.Decode(&data)

Но это не сработает.

Вам необходимо передать struct, который фактически может использоваться для декодирования полей в XML, которые возвращает команда nvidia-smi.

Найдите ниже модифицированный пример (заменив nvidia-smi на команду echo, чтобы она возвращала образец XML).

Вы должны настроить структуру, чтобы иметь возможность отображать фактический XML, который вы получите.

Кстати:

  • Вы должны проверить ошибку, возвращаемую decode на всякий случай
  • Я не понимаю, почему вы декодируете в отдельной программе. Я оставил это так в модифицированном примере, но это сработало бы, если бы вы сделали это правильно в той же самой программе.

Пример:

package main

import (
    "log"
    "os/exec"
    "fmt"
    "encoding/xml"
)

func checkError(err error) {
    if err != nil {
        log.Fatalf("Error: %s", err)
    }
}

type Result struct {
    Value int `xml:"value"`
}

func metrics() {
    cmd := exec.Command(
        "echo", "-n",
        `<result><value>1</value></result>`)

    out, err := cmd.StdoutPipe()
    checkError(err)

    cmd.Start()

    defer cmd.Wait()

    go func() {
        var data Result
        dec := xml.NewDecoder(out)
        err = dec.Decode(&data)
        checkError(err)
        fmt.Printf("Data: %+v\n", data)
    }()

    //go io.Copy(os.Stdout, out)
}

func main() {
    metrics()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...