问题描述

所以我的脚本会像这样调用一个外部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脚本退出)?

Start()和
 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!