进程可以读取自己的 "standard out" 流吗?
Can a process read its own "standard out" stream?
进程如何读取自己的输出流?我正在编写自动化测试,它在与测试相同的进程中启动一些应用程序子进程(应用程序)。因此,标准输出是测试输出和应用程序输出的混合。
我想在运行时读取输出流,如果我看到来自应用程序的错误,则测试失败。这是possible/feasible吗?如果可以,我该怎么做?
注意:我知道我可以将应用程序作为它们自己的独立进程启动,然后读取它们的输出流。从我现在的位置来看,这是很多工作。
另请注意,这不是 How to test a function's output (stdout/stderr) in Go unit tests 的骗局,尽管该票证相似且有用。另一张票是关于捕获单个函数调用的输出。这张票是关于连续阅读整个流的。正确答案也有点不同 - 它需要一个管道。
是的,您可以使用os.Pipe()
然后自己处理:
tmp := os.Stdout
r, w, err := os.Pipe()
if err != nil {
panic(err)
}
os.Stdout = w
或将 os.Stdout
转移到另一个文件或 strings.Builder
。
详细答案如下:
In Go, how do I capture stdout of a function into a string?
In Go, how do I capture stdout of a function into a string? using a os.Pipe (a form of IPC 中给出的答案的略微修改版本):
Pipe returns a connected pair of Files; reads from r return bytes written to w. It returns the files and an error, if any.
作为os.Stdout is an *os.File,您可以将其替换为任何文件。
package main
import (
"bytes"
"fmt"
"io"
"log"
"os"
)
func main() {
old := os.Stdout
r, w, _ := os.Pipe() // TODO: handle error.
os.Stdout = w
// All stdout will be caputered from here on.
fmt.Println("this will be caputered")
// Access output and restore previous stdout.
outc := make(chan string)
go func() {
var buf bytes.Buffer
io.Copy(&buf, r) // TODO: handle error
outc <- buf.String()
}()
w.Close()
os.Stdout = old
out := <-outc
log.Printf("captured: %s", out)
}
进程如何读取自己的输出流?我正在编写自动化测试,它在与测试相同的进程中启动一些应用程序子进程(应用程序)。因此,标准输出是测试输出和应用程序输出的混合。
我想在运行时读取输出流,如果我看到来自应用程序的错误,则测试失败。这是possible/feasible吗?如果可以,我该怎么做?
注意:我知道我可以将应用程序作为它们自己的独立进程启动,然后读取它们的输出流。从我现在的位置来看,这是很多工作。
另请注意,这不是 How to test a function's output (stdout/stderr) in Go unit tests 的骗局,尽管该票证相似且有用。另一张票是关于捕获单个函数调用的输出。这张票是关于连续阅读整个流的。正确答案也有点不同 - 它需要一个管道。
是的,您可以使用os.Pipe()
然后自己处理:
tmp := os.Stdout
r, w, err := os.Pipe()
if err != nil {
panic(err)
}
os.Stdout = w
或将 os.Stdout
转移到另一个文件或 strings.Builder
。
详细答案如下:
In Go, how do I capture stdout of a function into a string?
In Go, how do I capture stdout of a function into a string? using a os.Pipe (a form of IPC 中给出的答案的略微修改版本):
Pipe returns a connected pair of Files; reads from r return bytes written to w. It returns the files and an error, if any.
作为os.Stdout is an *os.File,您可以将其替换为任何文件。
package main
import (
"bytes"
"fmt"
"io"
"log"
"os"
)
func main() {
old := os.Stdout
r, w, _ := os.Pipe() // TODO: handle error.
os.Stdout = w
// All stdout will be caputered from here on.
fmt.Println("this will be caputered")
// Access output and restore previous stdout.
outc := make(chan string)
go func() {
var buf bytes.Buffer
io.Copy(&buf, r) // TODO: handle error
outc <- buf.String()
}()
w.Close()
os.Stdout = old
out := <-outc
log.Printf("captured: %s", out)
}