第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

無(wú)法將 shell 命令的輸出寫入 Go 中的文件

無(wú)法將 shell 命令的輸出寫入 Go 中的文件

Go
泛舟湖上清波郎朗 2021-12-07 16:41:07
我編寫了以下用于執(zhí)行snt2cooc命令的函數(shù)(運(yùn)行GIZA++的預(yù)處理步驟之一。出于我們的目的,我認(rèn)為我們可以將snt2cooc腳本視為一個(gè)黑匣子):func SNTToCOOC(srcVocab, tgtVocab, sntPath, outpath string) error {    // open the out file for writing    outfile, err := os.Create(outpath)    if err != nil {        return err    }    defer outfile.Close()    cmdStr := "snt2cooc"    args := []string{srcVocab, tgtVocab, sntPath}    cmd := exec.Command(cmdStr, args...)    cmd.Stdout = outfile    if err = cmd.Run(); err != nil {        return err    }    cmd.Wait()    return err}運(yùn)行時(shí),函數(shù)執(zhí)行沒(méi)有錯(cuò)誤,但輸出文件為空。相同的代碼適用于其他類似的命令,但不適用于此特定snt2cooc命令,我注意到當(dāng)我直接在 shell 中運(yùn)行此命令時(shí):snt2cooc file1.vcb file2.vcb file3.snt我得到以下輸出:END.0 20 30 40 50 6(為簡(jiǎn)潔起見(jiàn)被截?cái)啵┤绻抑苯訌?shell 將命令的輸出發(fā)送到一個(gè)文件:snt2cooc file1.vcb file2.vcb file3.snt > out.txt內(nèi)容out.txt如預(yù)期:0 20 30 40 50 6請(qǐng)注意,在第一種情況下,該行END.首先輸出到 stdout,然后才是發(fā)送到 stdout 的命令的實(shí)際輸出。因此,我認(rèn)為存在競(jìng)爭(zhēng)條件,即 Go 代碼在命令的最終輸出寫入文件之前完成執(zhí)行。這盡管調(diào)用cmd.Wait(). 我不太確定該snt2cooc命令在內(nèi)部究竟在做什么。有人可以提供有關(guān)如何解決此問(wèn)題的提示嗎?編輯1:看起來(lái)像下面的代碼,包括 500 毫秒的睡眠,一致地將輸出寫入snt2cooc命令的文件:cmdStr := "snt2cooc"args := []string{srcVocab, tgtVocab, sntPath}cmd := exec.Command(cmdStr, args...)stdout, err := cmd.StdoutPipe()time.Sleep(500 * time.Millisecond)if err != nil {    return err}err = cmd.Start()if err != nil {    return err}out := bufio.NewScanner(stdout)for out.Scan() {    outfile.Write(out.Bytes())    outfile.WriteString("\n")}if err := out.Err(); err != nil {    return err}這向我證明存在一些競(jìng)爭(zhēng)條件,Go 程序在所有輸出寫入文件之前退出。我為這個(gè)問(wèn)題增加了懸賞,希望有人可以 1) 解釋為什么會(huì)發(fā)生這種情況,2) 提供一種非 hacky 的方式(即 500 毫秒睡眠)來(lái)解決它。
查看完整描述

2 回答

?
撒科打諢

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊

首先,清理你的代碼。


cmd.Stderr = os.DevNull,所以你忽略 stderr。Stdout 和 Stderr 指定進(jìn)程的標(biāo)準(zhǔn)輸出和錯(cuò)誤。如果其中一個(gè)為 nil,則 Run 將相應(yīng)的文件描述符連接到空設(shè)備 (os.DevNull)。


cmd.Wait()返回error,你忽略它。func (c *Cmd) Wait() error.


Wait等待命令退出。它一定是由Start.你啟動(dòng)的,Run,而不是Start.


當(dāng)您運(yùn)行此代碼時(shí),您會(huì)得到什么輸出?


failure.go:


package main


import (

    "fmt"

    "os"

    "os/exec"

)


func main() {

    err := SNTToCOOC("file1.vcb", "file2.vcb", "file3.snt", "out.txt")

    if err != nil {

        fmt.Println(err)

    }

}


func SNTToCOOC(srcVocab, tgtVocab, sntPath, outpath string) error {

    outfile, err := os.Create(outpath)

    if err != nil {

        return err

    }

    defer outfile.Close()

    cmdStr := "snt2cooc"

    args := []string{srcVocab, tgtVocab, sntPath}

    cmd := exec.Command(cmdStr, args...)

    cmd.Stdout = outfile

    cmd.Stderr = os.Stderr

    err = cmd.Run()

    if err != nil {

        return err

    }

    return err

}

跑:


$ rm -f out.txt && go run failure.go && cat out.txt

此外,當(dāng)您運(yùn)行此代碼并cmd.Stdout = os.Stdout替換cmd.Stdout = outfile.


查看完整回答
反對(duì) 回復(fù) 2021-12-07
?
HUWWW

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊

問(wèn)題不在于內(nèi)部,SNTtoCooc而在于您如何使用cmd.Stdout以下內(nèi)容寫入文件本身:


func anyWrite(args []string, outpath string) error {

        outfile, err := os.Create(outpath)

        if err != nil {

                return err

        }


        defer outfile.Close()


        // I use simple "echo" here

        cmd := exec.Command("echo", args...)

        stdout, err := cmd.Output()

        if err != nil {

                return err

        }


        // Use this instead of cmd.Stdout seems to solve the problem

        outfile.Write(stdout)


        return nil

}


func main() {

        args := []string{"Line 1", "Line 2", "Line 3"}

        if err := anyWrite(args, "./outfile.txt"); err != nil {

                panic(err) 

        }

按照該意見(jiàn)中os/exec


Stdout 和 Stderr 指定進(jìn)程的標(biāo)準(zhǔn)輸出和錯(cuò)誤。如果其中一個(gè)為 nil,則 Run 將相應(yīng)的文件描述符連接到空設(shè)備 (os.DevNull)。


查看完整回答
反對(duì) 回復(fù) 2021-12-07
  • 2 回答
  • 0 關(guān)注
  • 263 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)