首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go子进程通信

Go子进程通信
EN

Stack Overflow用户
提问于 2014-03-27 06:40:38
回答 1查看 1.8K关注 0票数 6

GO:有没有办法与等待stdin输入的子进程(shell脚本/ python脚本)进行通信?

例如python脚本(子进程)

代码语言:javascript
复制
import sys
while True:
    sys.stdout.write('%s\n'%eval(sys.stdin.readline()))

在go程序中,我希望创建这个python脚本的子进程,并在必要和反复的情况下在stdin上提供它的输入,并获取它的输出。在Go程序的标准输出上写入或从文件中读取/写入也可以。

这大概是我想做的,但什么都没发生-

代码语言:javascript
复制
c := exec.Command("python", "-u add.py")
si,_ := c.StdinPipe()
so,_ := c.StdoutPipe()    
c.Start()
si.Write([]byte("2+2\n")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-27 11:00:58

下面是go代码的工作版本(python代码不变)。

注意:检查所有错误,固定-u标志,使用布菲奥读取一行,等待进程结束。

代码语言:javascript
复制
import (
    "bufio"
    "fmt"
    "log"
    "os/exec"
)

func main() {
    c := exec.Command("python", "-u", "add.py")
    si, err := c.StdinPipe()
    if err != nil {
        log.Fatal(err)
    }

    so, err := c.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }
    reader := bufio.NewReader(so)

    err = c.Start()
    if err != nil {
        log.Fatal(err)
    }

    // Now do some maths
    for i := 0; i < 10; i++ {
        sum := fmt.Sprintf("2+%d\n", i)
        _, err = si.Write([]byte(sum))
        if err != nil {
            log.Fatal(err)
        }
        answer, err := reader.ReadString('\n')
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Answer to %q is %q\n", sum, answer)
    }

    // Close the input and wait for exit
    si.Close()
    so.Close()
    c.Wait()
}

代码语言:javascript
复制
Answer to "2+0\n" is "2\n"
Answer to "2+1\n" is "3\n"
Answer to "2+2\n" is "4\n"
Answer to "2+3\n" is "5\n"
Answer to "2+4\n" is "6\n"
Answer to "2+5\n" is "7\n"
Answer to "2+6\n" is "8\n"
Answer to "2+7\n" is "9\n"
Answer to "2+8\n" is "10\n"
Answer to "2+9\n" is "11\n"
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22680080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档