2010-09-02 78 views
2

我有一个python脚本,它使用subprocess.Popen来运行另一个python脚本的多个实例,每个脚本运行在不同的文件上。Python的错误代码

我有一个300个文件的集合,我通过这个过程来测试目的。每次运行时,随机数的文件都会失败,总是会有不同的文件,所以文件本身并没有什么问题,但是当子进程发生时,子进程会以错误代码-6或-11退出。如果我用相同的输入文件再次运行脚本,它会成功运行。

什么是-6和-11?它们可以与python异常相关吗?

编辑说明:脚本实际上是django管理命令。我有一个很大的try:except子句,它捕获任何异常并调用sys.exit(1),所以失败发生在我的代码之外。可能在加载其他模块。我检查了django源代码,并且在出现任何错误时似乎总是调用sys.exit(1),所以-6和-11似乎来自较低级别。我认为他们可能是与比赛条件有关的奥斯卡,但我不能确定这一点。

+0

退出状态代码是脚本中的返回值。脚本的'sys.exit()'做了什么? – 2010-09-02 19:16:55

+0

请参阅我对原始问题所做的修改。 – user61000 2010-09-02 19:20:06

回答

6

您是否从mysubproc.returncode获取退出状态?

http://docs.python.org/library/subprocess.html#subprocess.Popen.returncode

负值-N表示 孩子通过信号N 终止(仅限Unix)。

信号6 & 11是SIGABRT(中止)和SIGSEGV(段错误)(http://linux.die.net/man/7/signal)。我的猜测是那些其他脚本随着扩展或扩展依赖的库之一而变得糟糕。您可能会有一个糟糕的构建 - 如果您手动进行了重新编译,或者查看是否有更新的程序包。

+0

这正是我正在寻找的..谢谢一吨。出于好奇,什么会导致SIGABRT? – user61000 2010-09-02 19:39:42

+0

@ user61000 - 据我所知,它通常来自C/C++运行时的内存管理 - 就像使用双重删除等一样。它将依次调用abort(),它基本上使进程向SIGABRT发出信号。这似乎与无效的内存引用携手并进......听起来像是其中一个库中存在一些错误的指针/内存管理。 – 2010-09-02 19:49:47

+0

@ user61000 - 这回答有关SIGABRTs来自哪里的问题:) http://stackoverflow.com/questions/3413166/when-does-a-process-get-sigabrt-signal-6 – 2010-09-02 19:55:03