2010-09-02 111 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