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.

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)。
- 2 回答
- 0 關(guān)注
- 263 瀏覽
添加回答
舉報(bào)