2014-12-20 19 views
8

Golang'dan bir alt işlem oluşturmaya çalışıyorum. Amaç, giriş satırını okumak ve işlemektir. Bu örnekteBir alt işlemden okuma Metni

func readStuff(scanner *bufio.Scanner) { 
    for scanner.Scan() { 
     fmt.Println("Performed Scan") 
     fmt.Println(scanner.Text()) 
    } 
    if err := scanner.Err(); err != nil { 
     fmt.Fprintln(os.Stderr, "reading standard input:", err) 
    } 
} 

func main() { 
    cmd := exec.Command("/usr/local/bin/pocketsphinx_continuous", "-inmic", "yes") 
    out, err := cmd.StdoutPipe() 

    err = cmd.Start() 
    checkError(err) 

    scanner := bufio.NewScanner(out) 
    fmt.Println("Scanner created") 

    defer cmd.Wait() 
    go readStuff(scanner) 
} 

, "Tarayıcı oluşturulan" yazdırılır, ama hiçbir şey bundan sonra olur: İşte çalışma almak çalışıyorum budur. Bu komut ancak bekliyorum neyi neden yok Running

için basılacak:

/usr/local/bin/pocketsphinx_continuous -inmic yes 1>out.txt 

Ve doğrudan stdout kopyalamak için kod değiştirerek de çalışır:

cmd := exec.Command("/usr/local/bin/pocketsphinx_continuous", "-inmic", "yes") 
cmd.Stdout = os.Stdout 

I neyim eksik olan bu çıktıyı okumamı engelliyor mu?

cevap

4

Kontrol etmek isteyebileceğiniz birçok şey vardır.

  1. cmd.StdoutPipe() ile döndürülen hata kodu kontrol edilmedi. Olmalı.

  2. pocketsphinx_continuous komut sağlanacak -hmm ve -dict argümanlar gerektirir. Aksi takdirde, başarısız olur ve tüm çıktılar aslında'a ve stdout'a gönderilmez. Burada sadece stdout'u okursunuz, fakat okunacak bir şey yok. Tüm verilere stdout adresinden okunduğundan emin olmanız için cmd.Wait() numaralı telefonu aramamalısınız. Sonuç belirleyici değildir (aslında bir yarış koşulu). os/exec paketi ile ilgili belgeleri kontrol edin. Eğer bir goroutine yapılacak ayrışmaya kesinlikle ihtiyacınız varsa, cmd.Wait() çağrılmadan önce goroutinin sonuna kadar senkronize etmeniz gerekir.

    stop := make(chan bool) 
    go readStuff(scanner,stop) 
    <-stop 
    cmd.Wait() 
    
+0

Teşekkür (bunun için gorouting yumurtlama değil). Bu hatayı kontrol etmek için kodumu güncelledim ve tüm satırları okumadan önce beklemeyin. Hala sadece StdErr'den çizgiler görüyorum. (PocketSphinx hala bu argümanlar olmadan çalışacak, sadece zayıf bir tanıma sahip olacak) http://hastebin.com/ojetacoraw.go – tgrosinger

0

değil

go readStuff(scanner) 

çünkü

cmd.Start() 
ihtiyacı görünüyor: olarak

func readStuff(scanner *bufio.Scanner, stop chan bool) { 
    // Scanning code 
    // ... 
    stop<-true 
} 

ve ana kod: Örneğin, olarak işlev yazabilirsiniz

aklıma için yüzden sadece

readStuff(scanner) 

yeterli olacağını sistem çatal kendisi yapmak yanıt

İlgili konular