我正在编写一个go程序,该程序通过stdin将数据发送到另一个程序,并通过stdout读取响应.

下面是一个充当某种" echo 服务器"的脚本:

import sys

if __name__=='__main__':
    for line in sys.stdin:
        print("Hello", line.strip())

当我试图在围棋中与这个程序交流时,它挂在buf.ReadLine()上.以下是我的GO代码:

package main

import (
    "bufio"
    "log"
    "os/exec"
)

func main() {
    cmd := exec.Command("python3", "app.py")
    stdout, _ := cmd.StdoutPipe()
    stdin, _ := cmd.StdinPipe()

    cmd.Start()

    stdin.Write([]byte("Bob\n"))

    buf := bufio.NewReader(stdout)
    buf.ReadLine()
    log.Println(buf)
}

Write()函数不返回错误.然而,当我try 到ReadLine()时,程序挂起了.我做错了什么?

推荐答案

这不是go代码的问题;您的Python程序正在缓冲输出,因为它的stdout是一个管道而不是一个终端,因此go没有什么可读的,并且您有一个死锁,其中两个进程都在等待输入,而两个进程都不产生任何输出.

请参见how can I flush the output of the print functionDisable output buffering以了解在Python中处理它的方法--第一个方法适用于单个print语句,第二个方法适用于整个程序.对于您的简单示例,它们都是相同的,但在其他情况下,它们可能不同,因此有必要了解这些选项.

Go相关问答推荐

如何创建两个连接的io.ReadWriteClosers以用于测试目的

如何在GoFr中为生产和本地环境设置不同的配置?

未对GoFr中的所有请求进行跟踪

格式化 Azure SDK 的 golang 时间

从 ApiGateway 中的 lambda Go 返回 Json

如何在 Golang http.Request 对象中读取自定义 ajaxParams

Golang:如何判断通过缓冲通道进行通信时生产者或消费者是否较慢?

如何使用带有方法的字符串枚举作为通用参数?

接受通道和切片的通用函数

如何模仿联合类型

go-libp2p - 从流中接收字节

Golang Gin 绑定请求正文 XML 到 Slice

如何将文件上传到 Google Drive,并与使用服务帐户和 Golang 的任何人共享

在 Raspberry Pi4 上下载 Go Mod

Golang prometheus 显示自定义指标

如何在gin中获取参数值数组

具有近似约束的函数值导致的实例化失败

httprouterhttp.HandlerFunc() 是如何工作的?

Go 泛型是否与 LINQ to Objects 等效?

为什么 Go 不允许将一个泛型分配给另一个泛型?