所以我的 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)
}
}()
Run Code Online (Sandbox Code Playgroud)
它同时运行我的 python 脚本,这很棒。但是现在的问题是,我的python脚本会无限运行,不时会打印出一些信息。我想“捕获”这些 Stdout 并将它们打印在我的 golang 终端上。我如何同时执行(无需等待我的 python 脚本退出)?
使用cmd.Start()和cmd.Wait()代替cmd.Run()。
https://golang.org/pkg/os/exec/#Cmd.Run
Run 启动指定的命令并等待它完成。
Start 启动指定的命令,但不等待它完成。
Wait 等待命令退出。它一定是由 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())
}
}
Run Code Online (Sandbox Code Playgroud)
以下是用于再现实时输出的示例 Python 代码。标准输出可以在 Python 中缓冲。可能需要显式冲洗。
import time
import sys
while True:
print "Hello"
sys.stdout.flush()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7021 次 |
| 最近记录: |