首頁 > 後端開發 > Golang > 主體

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

王林
發布: 2024-02-06 08:18:04
轉載
976 人瀏覽過

无法在 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
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板