Maison >développement back-end >Golang >Impossible de lire depuis Pipe en utilisant exec.Command dans Go
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?
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!