Tidak boleh membaca daripada Pipe menggunakan exec.Command dalam Go

王林
Lepaskan: 2024-02-06 08:18:04
ke hadapan
977 orang telah melayarinya

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

Kandungan soalan

Saya sedang menulis program go yang menghantar data ke program lain melalui stdin dan membaca respons melalui stdout.

Berikut ialah skrip yang bertindak sebagai "pelayan gema" jenis:

import sys

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

Apabila saya cuba berkomunikasi dengan program dalam Go, ia akan bertahan buf.ReadLine(). Ini kod Go saya:

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)
}
Salin selepas log masuk
Bila

Write() 函数不返回错误。但是,当我尝试 ReadLine(), program hang. Apa yang saya buat salah?


Jawapan betul


Ini bukan masalah dengan kod Go; program Python anda menimbal keluaran kerana stdoutnya adalah paip dan bukan terminal, jadi Go tidak mempunyai apa-apa untuk dibaca dan anda mendapat kebuntuan, kedua-dua proses adalah menunggu input, dan proses tidak menghasilkan apa-apa output.

Lihat Cara Siram Fungsi Cetakan atau Lumpuhkan Penimbalan Output untuk cara mengendalikannya dalam Python - yang pertama terpakai pada satu kenyataan cetakan, yang kedua pada keseluruhan program. Untuk contoh mudah anda semuanya adalah sama, tetapi dalam kes lain ia mungkin berbeza, jadi anda patut mengetahui pilihannya.

Atas ialah kandungan terperinci Tidak boleh membaca daripada Pipe menggunakan exec.Command dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan