exec.Command管道实现循环输入

hipeace86 · 2016-10-26 05:01:27 · 4066 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2016-10-26 05:01:27 的主题,其中的信息可能已经有所发展或是发生改变。

目前有一个程序需要启用另外一个code.exe程序来做转码处理 此程序运行后是一个死循环的,就等待输入按回车后就返回相应的解码数据

现在用exec.Command启动程序后就只能使用管道输入一次,代码如下

cmd := exec.Command("./code.exe")
var pipIn,pipOut bytes.Buffer
cmd.Stdin = &pipIn
cmd.Stdout = &pipOut

cmd.Run()
pipIn.WriteString(fmt.Sprintf("%s\n", "35063812556aa2cdd6d1cbd"))

time.Sleep(time.Millisecond * 500)
fmt.Println(strings.Replace(pipOut.String(), "\n", "", 1))
pipIn.WriteString(fmt.Sprintf("%s\n", "350632125e6aa2cdded1c"))
time.Sleep(time.Millisecond * 500)
fmt.Println(strings.Replace(pipOut.String(), "\n", "", 1))

并不能得到第二次输入的数据解码后的结果 可有其它方法实现长时运行code.exe程序,可以循环输入并得到输出结果的方法? 类似于python的spawn 新手对标准库还不熟悉,还请各大神指教!


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4066 次点击  
加入收藏 微博
4 回复  |  直到 2016-10-26 11:57:39
stevewang
stevewang · #1 · 8年之前

cmd.Run()返回以后,子进程都已经结束了。

stevewang
stevewang · #2 · 8年之前

供参考:

package main

import (
    "bufio"
    "fmt"
    "io"
    "os/exec"
)

func encode(r *bufio.Reader, w io.Writer, str string) string {
    w.Write([]byte(str))
    w.Write([]byte("\n"))
    str, err := r.ReadString('\n')
    if err != nil {
        panic(err)
    }
    // skip '\n'
    return str[:len(str)-1]
}

func main() {
    cmd := exec.Command(`./code.exe`)
    inr, inw := io.Pipe()
    outr, outw := io.Pipe()
    cmd.Stdin = inr
    cmd.Stdout = outw
    if err := cmd.Start(); err != nil {
        panic(err)
    }
    go cmd.Wait()
    strs := []string{
        "35063812556aa2cdd6d1cbd",
        "350632125e6aa2cdded1c",
    }
    for _, str := range strs {
        result := encode(bufio.NewReader(outr), inw, str)
        fmt.Println(result)
    }
}
hipeace86
hipeace86 · #3 · 8年之前
stevewangstevewang #2 回复

供参考: ``` package main import ( "bufio" "fmt" "io" "os/exec" ) func encode(r *bufio.Reader, w io.Writer, str string) string { w.Write([]byte(str)) w.Write([]byte("\n")) str, err := r.ReadString('\n') if err != nil { panic(err) } // skip '\n' return str[:len(str)-1] } func main() { cmd := exec.Command(`./code.exe`) inr, inw := io.Pipe() outr, outw := io.Pipe() cmd.Stdin = inr cmd.Stdout = outw if err := cmd.Start(); err != nil { panic(err) } go cmd.Wait() strs := []string{ "35063812556aa2cdd6d1cbd", "350632125e6aa2cdded1c", } for _, str := range strs { result := encode(bufio.NewReader(outr), inw, str) fmt.Println(result) } } ```

谢谢,code.exe是一个死循环的程序,应该不会终止的 换了另外一种方法实现了,代码附到下面

hipeace86
hipeace86 · #4 · 8年之前

解决方案如下:

  1 DecodeCmd = exec.Command("code.exe")
  2 pipIn, _ := rabbit.DecodeCmd.StdinPipe()
  3 pipOut, _ := rabbit.DecodeCmd.StdoutPipe()
  4 DecodeCmd.Start()
  5 CmdBufReader = bufio.NewReader(pipOut)
  6 CmdBufWriter = bufio.NewWriter(pipIn)
  7
  8 CmdBufWriter.WriteString(fmt.Sprintf("%s\n", "35063812556aa2cdd6d1cbd"))
  9 CmdBufWriter.Flush()
 10 code, _, _ := r.CmdBufReader.ReadLine()
 11 CmdBufWriter.WriteString(fmt.Sprintf("%s\n", "350632125e6aa2cdded1c"))
 12 CmdBufWriter.Flush()
 13 code, _, _ = r.CmdBufReader.ReadLine()
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传