我正在编写一个对学生程序进行评分的程序,我相信您可以想象,它们有时会出现段错误。我遇到的问题是,当学生编写段错误时,没有任何迹象表明发生了什么。
proc = subprocess.Popen(student_command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = proc.communicate()
self.returncode = proc.returncode
我从 subprocess
中获取 stderr
、stdout
和返回码,但是如果程序段错误, stderr
为空,stdout
为空,返回码为-11。现在我可以查找 -11 退出代码并假设如果那是返回代码,则存在段错误,但也没有什么可以阻止学生的代码将 -11 作为返回代码只是因为学生想要返回-11.
您如何判断子流程分段是否出错,而不是仅仅感觉返回 -11?我不太关心 stderr 和 stdout 中的内容,为此我看过很多帖子,包括 this处理获取输出,但我不太关心输出,虽然从 stderr 中获取“Segmentation Fault”字符串会很好,但我真正需要的是一种明确告诉什么的方法发生在子进程上。
最佳答案
事实上,在 UNIX 上,尝试返回 -11
的进程通常最终会返回一个正整数。这是因为 wait
系列函数的返回状态实际上是一组位字段,其中一个字段用于结束进程的信号,另一个字段用于返回值。 Python 解码来自这些位域的 wait
返回值。
在大多数系统上,这些字段是无符号的,大小为 8 位,因此您可能会看到如下内容:
>>> import subprocess
>>> subprocess.Popen(['python','-c','import os; os.kill(os.getpid(),11)']).wait()
-11
>>> subprocess.Popen(['python','-c','exit(-11)']).wait()
245
在前一种情况下,进程“出现段错误”(通过使用 SIGSEGV 终止自身),因此 wait
返回 -11。在后一种情况下,进程退出并返回代码 -11,生成的 wait
值为 245 (256-11)。因此,您可以放心,wait
的任何负返回值都必须表示致命信号,而不是正常返回。但请注意,进程可能会自杀以伪造 fatal error 。
关于python - 确定 python 子进程段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18731791/