PTY command usage #
Go执行python脚本,异步读取输出,但是无法实时生成输出信息,有些许延迟
-
强制命令实时输出:某些命令支持参数或环境变量来禁用输出缓冲。例如,python的
-u
选项或强制stdbuf
、unbuffer
工具在命令前使用,可以减少或消除输出缓冲。 -
使用
pty
(伪终端):另一个解决方案是使用伪终端(pty)来执行命令。许多命令会检测它们是否直接与终端连接,并在是的情况下禁用或减少输出缓冲。使用pty
库来启动命令,命令就会认为它直接与终端连接,可能会更频繁地刷新其输出。
安装 go get github.com/creack/pty
。
package main
import (
"fmt"
"io"
"os"
"os/exec"
"github.com/creack/pty"
)
func main() {
cmd := exec.Command("bash", "-c", "command")
// Using the pty start command
f, err := pty.Start(cmd)
if err != nil {
panic(err)
}
defer f.Close()
// Create a goroutine to read the output.
go func() {
buf := make([]byte, 1024)
for {
n, err := f.Read(buf)
if err != nil {
if err != io.EOF {
fmt.Fprintln(os.Stderr, "read error:", err)
}
return
}
fmt.Print(string(buf[:n]))
}
}()
// Wait for command execution to complete
err = cmd.Wait()
if err != nil {
fmt.Fprintln(os.Stderr, "command error:", err)
}
}