加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 进行子进程通信

发布时间:2020-12-16 21:29:54 所属栏目:Python 来源:网络整理
导读:GO:有没有办法与子进程( shell脚本/ python脚本)进行通信,它正在等待stdin上的输入? 例如python脚本(子进程) import syswhile True: sys.stdout.write('%sn'%eval(sys.stdin.readline())) 在go程序中,我想创建这个python脚本的子进程,并在必要时重复地在
GO:有没有办法与子进程( shell脚本/ python脚本)进行通信,它正在等待stdin上的输入?

例如python脚本(子进程)

import sys
while True:
    sys.stdout.write('%sn'%eval(sys.stdin.readline()))

在go程序中,我想创建这个python脚本的子进程,并在必要时重复地在其stdin上提供输入,并获取其输出.在Go程序的stdout上写或从文件读/写也可以.

这大致是我正在尝试的,但没有任何反应 –

c := exec.Command("python","-u add.py")
si,_ := c.StdinPipe()
so,_ := c.StdoutPipe()    
c.Start()
si.Write([]byte("2+2n")

解决方法

这是你的代码的工作版本(python代码没有变化).

注意:检查所有错误,修复-u标志,使用bufio读取一行,并使用Wait等待进程结束.

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+%dn",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 %qn",sum,answer)
    }

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

哪个产生

Answer to "2+0n" is "2n"
Answer to "2+1n" is "3n"
Answer to "2+2n" is "4n"
Answer to "2+3n" is "5n"
Answer to "2+4n" is "6n"
Answer to "2+5n" is "7n"
Answer to "2+6n" is "8n"
Answer to "2+7n" is "9n"
Answer to "2+8n" is "10n"
Answer to "2+9n" is "11n"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读