英文:
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论