首頁  >  文章  >  後端開發  >  無法在 Go 中使用 exec.Command 從 Pipe 讀取

無法在 Go 中使用 exec.Command 從 Pipe 讀取

王林
王林轉載
2024-02-06 08:18:04979瀏覽

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

問題內容

我正在編寫一個 go 程序,它透過 stdin 向另一個程式發送數據,並透過 stdout 讀取回應。

這是一個充當某種「回顯伺服器」的腳本:

import sys

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

當我嘗試在 Go 中與該程式通訊時,它掛在 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() 函數不回傳錯誤。但是,當我嘗試 ReadLine() 時,程式掛起。我做錯了什麼?


正確答案


這不是Go程式碼的問題;你的Python程式正在緩衝輸出,因為它的stdout是一個管道而不是終端,所以Go沒有什麼可讀取的,而且你會遇到死鎖,兩個行程都在等待輸入,沒有一個行程產生任何輸出。

請參閱如何刷新print 函數禁用輸出緩衝 以了解在Python 中處理它的方法- 第一個適用於單一列印語句,第二個適用於整個程式。對於您的簡單範例,它們都是相同的,但在其他情況下它們可能不同,因此值得了解這些選項。

以上是無法在 Go 中使用 exec.Command 從 Pipe 讀取的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除