我正在編寫一個 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中文網其他相關文章!