Maison > développement back-end > Golang > le corps du texte

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

王林
Libérer: 2024-02-06 08:18:04
avant
977 Les gens l'ont consulté

无法在 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())
Copier après la connexion

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)
}
Copier après la connexion
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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal