Maison >développement back-end >Golang >Impossible de lire depuis Pipe en utilisant exec.Command dans Go

Impossible de lire depuis Pipe en utilisant exec.Command dans Go

王林
王林avant
2024-02-06 08:18:041007parcourir

无法在 Go 中使用 exec.Command 从 Pipe 读取

Contenu de la question

J'écris un programme go qui envoie des données à un autre programme via stdin et lit la réponse via stdout.

Voici un script qui fait office de "serveur d'écho" :

import sys

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

Quand j'essaie de communiquer avec le programme dans Go, il se bloque buf.ReadLine(). Voici mon code 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)
}
Quand

Write() 函数不返回错误。但是,当我尝试 ReadLine(), le programme se bloque. Qu'ai-je fait de mal?


Bonne réponse


Ce n'est pas un problème avec le code Go ; votre programme Python met la sortie en mémoire tampon car sa sortie standard est un tube et non un terminal, donc Go n'a rien à lire et vous obtenez un blocage, les deux processus sont en attente d'une entrée, et aucun des deux processus ne produit de sortie.

Voir Comment vider une fonction d'impression ou Désactiver la mise en mémoire tampon de sortie pour savoir comment la gérer en Python - la première s'applique à une seule instruction d'impression, la seconde à l'ensemble du programme. Pour votre exemple simple, ils sont tous identiques, mais dans d'autres cas, ils peuvent être différents, il vaut donc la peine de connaître les options.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer