在 Golang 中运行外部 python,捕获连续的 exec.Command Stdout

2024-05-22

所以我的 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(使用前将#替换为@)

在 Golang 中运行外部 python,捕获连续的 exec.Command Stdout 的相关文章