2016-03-21 176 views
1

假設你的Python腳本不會由於任何類型的故障(異常,語法錯誤)而退出,並且該腳本不會由於sys.exit或os._exit而退出,那麼Python如何找出退出的代碼?什麼是Python的默認退出碼?

它似乎是0,這很有意義,因爲它指示* nix系統上沒有錯誤。但是,情況總是如此,它以0結束(上述情況除外)?令人驚訝的是,經過相當多的在線搜索後,除非另有說明,否則我找不到任何明確表示將以0退出的內容。

回答

1

sys.exit documents a default exit status of 0os._exit's docs specify a UNIX-like OS constant for "normal" exit status, os.EX_OK,但沒有記錄的保證,我可以找到一般退出狀態。

除此之外,我可以給你最好的是,在CPython的,該python可執行文件(包括Windows python.exe/pythonw.exe)在python.c通過調用Py_Main並返回無論它返回來實現;每對Py_Main的記載擔保,退出狀態是:

0如果解釋正常(即沒有一個例外)退出,1如果解釋退出由於異常,或者2如果參數列表不代表一個有效的Python命令行。

請注意,如果以其他方式未處理的SystemExit被觸發,該函數將不會返回1,但只要不設置Py_InspectFlag就退出進程。

所以這意味着簡單地流失了__main__模塊末尾,沒有活動異常應該總是返回0的CPython的,雖然備用口譯在技術上不要求做同樣的。

+0

感謝ShadowRanger。 Martin Broadhurst的答案(通過代碼追蹤更多)證實了Py_Main文檔。 –

1

用0退出Python比Python早了很長時間,它是POSIX standard的一部分。所有乖巧的方案表明以0

+0

是的,我知道0一直是* nix標準,意思是無錯誤。我只想以書面形式(或在Python源代碼中)看到它總是使用0,如果沒有異常,錯誤或顯式請求退出 –

1

Python的默認退出代碼成功退出爲0。這是這裏https://docs.python.org/2/library/exceptions.html#exceptions.SystemExit

記載然而,退出代碼將是無論在exit()quit()功能指定。因此,如果您正在使用腳本,則應始終在腳本或腳本文檔中檢查該特定腳本將返回的內容。例如:你可以在終端中啓動python,只需鍵入quit(1),即使沒有錯誤,它也會返回代碼1。

+2

這不太正確,因爲如果腳本沒有引發'SystemExit'不調用'sys.exit()'。 –

3

如果你看一下cpython source code

  1. main()Programs/python.c回報Py_Main()
  2. Py_Main()Modules/main.c回報run_file()
  3. run_file()返回值的返回值,也Modules/main.c回報0除非PyRun_AnyFileExFlags()返回非零值
  4. PyRun_AnyFileExFlags()Python/pythonrun.cexit()在 事件的一個SystemExit異常,如果 腳本設置退出代碼將不會返回。它只會返回非零值,如果 是內部錯誤。

所以run_file()的返回值是什麼使得腳本0的默認退出碼。