问题描述
所以我的脚本会像这样调用一个外部python$ b $ $ p code> cmd = exec.Command(python,game .py)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr $ b $ go func(){
err:= cmd.Run()
if err!= nil {
panic(err)
}
}()
它同时运行我的python脚本,非常棒。
但现在的问题是,我的python脚本会无限运行,它会不时打印出一些信息。我想要抓住这些Stdout并在我的golang终端上打印出来。如何同时执行(不等待我的python脚本退出)?
cmd.Wait()
而不是 cmd.Run()
。
cmd .StdoutPipe() cmd.StderrPipe() bufio.NewScanner() $ fmtioos / exec) func main(){ cmd:= exec.Command(python ,game.py) stdout,err:= cmd.StdoutPipe() if err!= nil { panic(err)} stderr, err:= cmd.StderrPipe() if err!= nil { panic(err)} err = cmd.Start() if err!= nil { panic(err)} go copyOutput(stdout) go copyOutput(stderr) cmd.Wait() } func copyOutput(r io.Reader){ scanner:= bufio.NewScanner(r) for scanner.Scan(){ fmt.Println( scanner.Text())} }
以下是用于复制实时输出的示例python代码。标准输出可以用Python进行缓冲。
进口时间
进口sys
,而True:
printHello
sys.stdout.flush()
time.sleep(1)
So my go script will call an external python like this
cmd = exec.Command("python","game.py")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
go func(){
err := cmd.Run()
if err != nil{
panic(err)
}
}()
It runs my python script concurrently which is awesome.But now the problem is, my python script will run infinitely and it will print out some information from time to time. I want to "catch" these Stdout and print them out on my golang terminal. How do I do it concurrently (without waiting my python script to exit)?
cmd.Start()cmd.Wait()cmd.Run()
cmd.StdoutPipe()cmd.StderrPipe()bufio.NewScanner()
package main
import (
"bufio"
"fmt"
"io"
"os/exec"
)
func main() {
cmd := exec.Command("python", "game.py")
stdout, err := cmd.StdoutPipe()
if err != nil {
panic(err)
}
stderr, err := cmd.StderrPipe()
if err != nil {
panic(err)
}
err = cmd.Start()
if err != nil {
panic(err)
}
go copyOutput(stdout)
go copyOutput(stderr)
cmd.Wait()
}
func copyOutput(r io.Reader) {
scanner := bufio.NewScanner(r)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
The following is a sample python code for reproducing real-time output. The stdout may be buffered in Python. Explicit flush may be required.
import time
import sys
while True:
print "Hello"
sys.stdout.flush()
time.sleep(1)
这篇关于在Golang中运行外部python,捕捉连续的exec.Command Stdout的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!