第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何調用外部程序并處理其輸出?

如何調用外部程序并處理其輸出?

Go
千萬里不及你 2022-06-13 15:34:31
我正在嘗試調用外部命令(例如,seq 10)并獲取其輸出,處理輸出然后打印出處理后的結果。但是下面的代碼不起作用。你能告訴我如何讓它工作嗎?// vim: set noexpandtab tabstop=2:package mainimport (    "bufio"    "io"    "os"    "log"    "os/exec")func main() {    cmd := exec.Command("seq", "10")    stdin := bufio.NewReader(cmd.Stdout)    err := cmd.Run()    if err != nil {        log.Fatalf("cmd.Run() failed with %s\n", err)    }    for {        line, err := stdin.ReadBytes('\n')        if err == io.EOF {            if len(line) == 0 { break }        } else {            if err != nil { log.Fatal(err) }            line = line[:(len(line)-1)]        }        os.Stdout.Write(line)        os.Stdout.Write([]byte{'\n'})    }}$ $ go run main.go # command-line-arguments./main.go:15:30: cannot use cmd.Stdout (type io.Writer) as type io.Reader in argument to bufio.NewReader:    io.Writer does not implement io.Reader (missing Read method)編輯:我也試過這個。但它也有錯誤。誰能給我看一個可行的例子。// vim: set noexpandtab tabstop=2:package mainimport (    "bufio"    "io"    "os"    "log"    "os/exec")func main() {    cmd := exec.Command("seq", "10")    stdout, err := cmd.StdoutPipe()    if err != nil { log.Fatal(err) }    stdin := bufio.NewReader(stdout)    err = cmd.Run()    if err != nil {        log.Fatalf("cmd.Run() failed with %s\n", err)    }    for {        line, err := stdin.ReadBytes('\n')        if err == io.EOF {            if len(line) == 0 { break }        } else {            if err != nil { log.Fatal(err) }            line = line[:(len(line)-1)]        }        os.Stdout.Write(line)        os.Stdout.Write([]byte{'\n'})    }}
查看完整描述

2 回答

?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

另一種方法(也是一種更簡潔的方法)是自動使用bufio.Scanner哪個句柄\n(或任何其他分隔符)。另一個優(yōu)點是這種方法沒有種族問題(去過那里,做過):


package main


import (

    "bufio"

    "fmt"

    "log"

    "os/exec"

)


func main() {

    cmd := exec.Command("seq", "10")

    stdout, err := cmd.StdoutPipe()

    if err != nil {

        log.Fatal(err)

    }

    err = cmd.Start()

    if err != nil {

        log.Fatalf("cmd.Start() failed with %s\n", err)

    }


    stdin := bufio.NewScanner(stdout)

    for stdin.Scan() {

        fmt.Println(stdin.Text())

    }

    cmd.Wait()

}

stdin.Scan()返回 false on EOF,一旦進程退出就會給出。cmd.Wait()將關閉StdoutPipe,您可以閱讀err.(exec.ExitError).ExitCode()以獲取退出代碼(如果退出非零)。


查看完整回答
反對 回復 2022-06-13
?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

您需要使用管道將標準輸出到閱讀器.StdoutPipe(),還需要使用exec.Command(..).Start()增量讀取(.Run()等待進程退出)。這是工作代碼:


// vim: set noexpandtab tabstop=2:


package main


import (

    "bufio"

    "fmt"

    "io"

    "log"

    "os"

    "os/exec"

)


func main() {

    cmd := exec.Command("seq", "10")

    cmdStdOut, err := cmd.StdoutPipe()

    cmdStdErr, err := cmd.StderrPipe()

    defer cmdStdOut.Close()

    if err != nil {

        log.Fatalf("command failed with %s\n", err)

    }

    stdoutReader := bufio.NewReader(cmdStdOut)

    stderrReader := bufio.NewReader(cmdStdErr)

    err = cmd.Start()

    if err != nil {

        log.Fatalf("cmd.Run() failed with %s\n", err)

    }

    // Read stdout

    for {

        line, err := stdoutReader.ReadBytes('\n')

        if err == io.EOF {

            if len(line) == 0 {

                break

            }

        } else {

            if err != nil {

                log.Fatal(err)

            }

            line = line[:(len(line) - 1)]

        }

        os.Stdout.Write(line)

        os.Stdout.Write([]byte{'\n'})

    }

    // Read stderr

    for {

        line, err := stderrReader.ReadBytes('\n')

        if err == io.EOF {

            if len(line) == 0 {

                break

            }

        } else {

            if err != nil {

                log.Fatal(err)

            }

            line = line[:(len(line) - 1)]

        }

        os.Stderr.Write(line)

        os.Stderr.Write([]byte{'\n'})

    }

    cmd.Wait()

    fmt.Println(cmd.ProcessState.ExitCode())

}


查看完整回答
反對 回復 2022-06-13
  • 2 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號