运行外部的Python脚本并检查退出状态。

huangapple go评论90阅读模式
英文:

Run external python script and check exit status

问题

你可以使用cmd.Run()方法的返回值来检查命令的退出状态。如果命令成功执行并且没有错误,返回值为nil;如果命令执行失败,返回值将是一个error对象。你可以根据返回值来确定命令是否成功执行。

要检查PNG文件是否成功创建,你可以在执行命令后,使用文件操作函数(如os.Stat())来检查文件是否存在。如果文件存在,则表示成功创建了PNG文件。

以下是一个示例代码:

cmd := exec.Command("python", "script.py")
err := cmd.Run()
if err != nil {
    // 命令执行失败
    fmt.Println("命令执行失败:", err)
} else {
    // 命令执行成功
    fmt.Println("命令执行成功")

    // 检查PNG文件是否存在
    _, err := os.Stat("output.png")
    if err == nil {
        // 文件存在,成功创建了PNG文件
        fmt.Println("成功创建了PNG文件")
    } else if os.IsNotExist(err) {
        // 文件不存在,创建PNG文件失败
        fmt.Println("创建PNG文件失败")
    } else {
        // 其他错误
        fmt.Println("检查PNG文件时发生错误:", err)
    }
}

请注意,你需要根据实际情况修改文件名和路径。

英文:

I run a python script that create a PNG file using the exec package:

cmd := exec.Command("python", "script.py")
cmd.Run()

How could I safely check the command exit state and that the PNG file was successfully created ?

答案1

得分: 6

检查cmd.Run()返回的错误将告诉您程序是否失败,但是获取进程的退出状态以进行数值比较而不解析错误字符串通常很有用。

这不是跨平台的(需要syscall包),但我想在这里记录一下,因为对于刚接触Go的人来说,可能很难弄清楚。

if err := cmd.Run(); err != nil {
    // Run有一些错误

    if exitErr, ok := err.(*exec.ExitError); ok {
        // err是exec.ExitError类型,其中嵌入了*os.ProcessState。
        // 现在我们可以调用Sys()来获取系统相关的退出信息。
        // 在Unix系统上,这是一个syscall.WaitStatus。

        if waitStatus, ok := exitErr.Sys().(syscall.WaitStatus); ok {
            // 现在我们终于可以获取真正的退出状态整数了
            fmt.Printf("程序以状态%d退出\n", waitStatus.ExitStatus())
        }
    }
}
英文:

Checking the error returned by cmd.Run() will let you know if the program failed or not, but it's often useful to get the exit status of the process for numerical comparison without parsing the error string.

This isn't cross-platform (requires the syscall package), but I thought I would document it here because it can be difficult to figure out for someone new to Go.

if err := cmd.Run(); err != nil {
	// Run has some sort of error

	if exitErr, ok := err.(*exec.ExitError); ok {
		// the err was an exec.ExitError, which embeds an *os.ProcessState.
		// We can now call Sys() to get the system dependent exit information.
		// On unix systems, this is a syscall.WaitStatus.

		if waitStatus, ok := exitErr.Sys().(syscall.WaitStatus); ok {
			// and now we can finally get the real exit status integer
			fmt.Printf("program exited with status %d\n", waitStatus.ExitStatus())
		}
	}
}

答案2

得分: 4

只需简单地检查cmd.Run()的返回值即可。如果程序返回任何错误或未以状态0退出,它将返回该错误。

if err := cmd.Run(); err != nil {
    panic(err)
}
英文:

Simply checking the return from cmd.Run() will do, if the program returned any error or didn't exit with status 0, it will return that error.

if err := cmd.Run(); err != nil {
    panic(err)
}

huangapple
  • 本文由 发表于 2014年7月1日 04:08:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/24498170.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定