2017-01-01 3 views
0

Так что мой сценарий будет идти вызывать внешнюю питона, как этотЗапуск внешнего питона в Golang, Ловля непрерывного exec.Command Stdout

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 будет работать бесконечно, и он будет время от времени распечатывать некоторую информацию. Я хочу «поймать» эти Stdout и распечатать их на моем терминале golang. Как мне сделать это одновременно (не дожидаясь выхода моего скрипта python)?

ответ

1

Использовать cmd.Start() и cmd.Wait() вместо cmd.Run().

https://golang.org/pkg/os/exec/#Cmd.Run

Run запускает указанную команду и ждет его завершения.

Начало запускает указанную команду, но не дожидаясь ее завершения.

Ждать ждет выхода команды. Он, должно быть, был запущен Start.

И если вы хотите, чтобы захватить стандартный вывод/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 для воспроизведения выход в реальном времени. Stdout может быть буферизирован в Python. Может потребоваться явный флеш.

import time 
import sys 

while True: 
    print "Hello" 
    sys.stdout.flush() 
    time.sleep(1) 
+0

Спасибо! Однако это все равно не помогает с получением стандартного вывода cmd. –

+0

О, извините. если вы хотите одновременно записывать stdout, как насчет cmd.StdoutPipe()? – minamijoyo

+0

@LouisNg Я обновляю свой ответ. Попробуй. – minamijoyo

Смежные вопросы