当前位置: 首页 > 面试题库 >

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

鲁博瀚
2023-03-14
问题内容

所以我的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脚本将无限运行,并且会不时输出一些信息。我想“捕获”这些Stdout,并在golang终端上将它们打印出来。如何同时执行(不等待我的pythonhtml" target="_blank">脚本退出)?


问题答案:

使用cmd.Start()cmd.Wait()代替cmd.Run()

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

运行将启动指定的命令并等待其完成。

启动将启动指定的命令,但不等待其完成。

等待等待命令退出。它必须已经由“开始”启动。

如果要同时捕获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)


 类似资料:
  • 问题内容: 我们有一个大型的golang应用程序,它使用记录器(实际上是自定义记录器)将输出写入定期轮换的日志文件中。 但是,当应用程序崩溃或出现panic()时,这些消息将变为标准错误。 有什么方法可以覆盖使用记录仪的紧急功能? 问题答案: 据我所知,您无法将恐慌的输出重定向到标准错误或记录器。最好的办法是将标准错误重定向到可以在外部或在程序内部执行的文件。 对于我的rclone程序,我重定向了

  • 问题内容: 我有一张table: 我想构造一个语句,给定一个事件可以返回从该事件开始的事件“运行”的长度。运行由以下方式定义: 如果两个事件之间的时间间隔不超过30秒,则两个事件将同时运行。 如果A和B一起运行,并且B和C一起运行,则A与C一起运行。 但是,我的查询不需要在时间上倒退,因此,如果我选择事件2,则仅将事件2、3和4计为从2开始的事件运行的一部分,而应将3作为事件返回。运行时间。 有任

  • 运行连续的 promise。 使用 Array.reduce() 通过创建 promise 链来运行连续的 promises,其中每个 promise 在 resolved 时返回下一个 promise 。 const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve()); cons

  • 我有一个脚本,它需要两个每次都不相同的输入。所以我必须在每次运行脚本时手动输入。我确实想把这个脚本部署到Heroku。但遗憾的是,我无法在heroku:worker中手动给出任何种类的输入。我不能使用任何环境变量,参数,因为这两个输入不是静态的。所以heroku:worker总是得到“没有输入”的错误。 所以我决定用命令< code > heroku run python 3 main . py

  • 问题内容: 感谢Mike提出的添加创建/插入语句的建议。 我想添加一个新列,即“当前条纹天数”,因此 结果 如下所示: 但我不知道如何将技巧与其他窗口功能结合使用以获取正确的结果。 问题答案: 在此表上构建(不使用SQL关键字“ date”作为列名。): 询问: 从另一个减去a得到一个。由于您一直在寻找连续的日子,因此下一行将增加 一 。如果从中减去,则整个条纹最终将归入同一组()。然后,很容易按

  • 问题内容: 我想在Go中实现“流程包装器”。基本上它将执行的是启动一个进程(比如说一个节点服务器)并监视它(捕获诸如SIGKILL,SIGTERM之类的信号…) 我认为要做的方法是使用以下命令在go例程中启动节点服务器: 然后,我想捕获由执行的命令生成的所有可能的信号。我是Go的新手,我们将不胜感激。 问题答案: Go中有三种执行程序的方式: 包含syscall.Exec,syscall.Fork