gpt4 book ai didi

go - Os/exec 优雅、循环兼容的标准输入和标准输出输入/输出

转载 作者:IT王子 更新时间:2023-10-29 01:58:54 32 4
gpt4 key购买 nike

示例脚本只是“wc -m”命令的包装器,简单的符号计数器。我尝试只用“teststrings” slice 元素提供输入。并在输出监听器 goroutine 接收每个字符串的符号数。寻找一种让“wc”永远倾听输入的方法。我注意到当我将 sleep 增加到

time.Sleep(6000 * time.Nanosecond)

wc 不要等待输入。

package main

import (
"bytes"
"fmt"
"os/exec"
"time"
)

func main() {
BashCommand := exec.Command("wc", "-m")
InputBytes := &bytes.Buffer{}
OutputBytes := &bytes.Buffer{}
BashCommand.Stdin = InputBytes
BashCommand.Stdout = OutputBytes
e := BashCommand.Start()
time.Sleep(1 * time.Nanosecond)
_, _ = InputBytes.Write([]byte("13symbolsting"))
if e != nil {
fmt.Println(e)
}
fmt.Println("after run")

teststrings := []string{
"one",
"twoo",
"threeeee",
}
for _, s := range teststrings {
_, _ = InputBytes.Write([]byte(s))

}

//result printer
go func() {
for {
line, _ := OutputBytes.ReadString('\n')
if line != "" {
fmt.Println(line)
}
}
}()
var input string
fmt.Scanln(&input) //dont exit until keypress

}

最佳答案

如果将 sleep 时间增加到一个较大的值,则由将 InputBytes 泵送到进程的命令启动的 goroutine 在数据写入 InputBytes 之前运行。 goroutine 关闭到子进程的管道并在未读取任何数据的情况下退出。

使用管道代替 bytes.Buffer:

c := exec.Command("wc", "-m")
w, _ := c.StdinPipe()
r, _ := c.StdoutPipe()
if err := c.Start(); err != nil {
log.Fatal(err)
}

w.Write([]byte("13symbolsting"))
teststrings := []string{
"one",
"twoo",
"threeeee",
}
for _, s := range teststrings {
w.Write([]byte(s))

}
w.Close() // Close pipe to indicate input is done.

var wg sync.WaitGroup
wg.Add(1)

go func() {
s := bufio.NewScanner(r)
for s.Scan() {
fmt.Println(s.Text())
}
wg.Done()
}()

wg.Wait()

另一种选择是在启动命令之前写入 bytes.Buffer 并等待命令完成后再读取输出:

c := exec.Command("wc", "-m")
var w, r bytes.Buffer
c.Stdin = &w
c.Stdout = &r

// Write data before starting command.

w.Write([]byte("13symbolsting"))
teststrings := []string{
"one",
"twoo",
"threeeee",
}
for _, s := range teststrings {
w.Write([]byte(s))

}

if err := c.Start(); err != nil {
log.Fatal(err)
}

// Wait for command to complete before reading data.

if err := c.Wait(); err != nil {
log.Fatal(err)
}

s := bufio.NewScanner(&r)
for s.Scan() {
fmt.Println(s.Text())
}

关于go - Os/exec 优雅、循环兼容的标准输入和标准输出输入/输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36649162/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com