所以我的 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脚本会无限运行,时不时会打印出一些信息。我想“捕获”这些标准输出并将它们打印在我的 golang 终端上。如何同时执行此操作(无需等待 python 脚本退出)?
Use cmd.Start()
and cmd.Wait()
代替cmd.Run()
.
https://golang.org/pkg/os/exec/#Cmd.Run https://golang.org/pkg/os/exec/#Cmd.Run
Run 启动指定的命令并等待其完成。
Start 启动指定的命令,但不等待它完成。
等待命令退出。它一定是由 Start 启动的。
如果您想同时捕获 stdout/stderr,请使用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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)