所以我的go脚本会像这样调用外部python
cmd = exec.Command("python","game.py") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr go func(){ err := cmd.Run() if err != nil{ panic(err) } }()
它同时运行我的python脚本,真棒。但是现在的问题是,我的python脚本将无限运行,并且会不时输出一些信息。我想“捕获”这些Stdout,并在golang终端上将它们打印出来。如何同时执行(不等待我的python脚本退出)?
使用cmd.Start()和cmd.Wait()代替cmd.Run()。
cmd.Start()
cmd.Wait()
cmd.Run()
https://golang.org/pkg/os/exec/#Cmd.Run
运行将启动指定的命令并等待其完成。 启动将启动指定的命令,但不等待其完成。 等待等待命令退出。它必须已经由“开始”启动。
运行将启动指定的命令并等待其完成。
启动将启动指定的命令,但不等待其完成。
等待等待命令退出。它必须已经由“开始”启动。
如果要同时捕获stdout / stderr,请使用cmd.StdoutPipe()/ cmd.StderrPipe()并通过bufio.NewScanner()
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()) } }
以下是用于再现实时输出的示例python代码。可以在Python中缓冲标准输出。可能需要显式冲洗。
import time import sys while True: print "Hello" sys.stdout.flush() time.sleep(1)