假設你的Python腳本不會由於任何類型的故障(異常,語法錯誤)而退出,並且該腳本不會由於sys.exit或os._exit而退出,那麼Python如何找出退出的代碼?什麼是Python的默認退出碼?
它似乎是0,這很有意義,因爲它指示* nix系統上沒有錯誤。但是,情況總是如此,它以0結束(上述情況除外)?令人驚訝的是,經過相當多的在線搜索後,除非另有說明,否則我找不到任何明確表示將以0退出的內容。
假設你的Python腳本不會由於任何類型的故障(異常,語法錯誤)而退出,並且該腳本不會由於sys.exit或os._exit而退出,那麼Python如何找出退出的代碼?什麼是Python的默認退出碼?
它似乎是0,這很有意義,因爲它指示* nix系統上沒有錯誤。但是,情況總是如此,它以0結束(上述情況除外)?令人驚訝的是,經過相當多的在線搜索後,除非另有說明,否則我找不到任何明確表示將以0退出的內容。
sys.exit
documents a default exit status of 0
和os._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退出Python比Python早了很長時間,它是POSIX standard的一部分。所有乖巧的方案表明以0
是的,我知道0一直是* nix標準,意思是無錯誤。我只想以書面形式(或在Python源代碼中)看到它總是使用0,如果沒有異常,錯誤或顯式請求退出 –
Python的默認退出代碼成功退出爲0。這是這裏https://docs.python.org/2/library/exceptions.html#exceptions.SystemExit
記載然而,退出代碼將是無論在exit()
或quit()
功能指定。因此,如果您正在使用腳本,則應始終在腳本或腳本文檔中檢查該特定腳本將返回的內容。例如:你可以在終端中啓動python,只需鍵入quit(1)
,即使沒有錯誤,它也會返回代碼1。
這不太正確,因爲如果腳本沒有引發'SystemExit'不調用'sys.exit()'。 –
如果你看一下cpython source code:
main()
在Programs/python.c
回報Py_Main()
Py_Main()
在Modules/main.c
回報run_file()
run_file()
返回值的返回值,也Modules/main.c
回報0
除非PyRun_AnyFileExFlags()
返回非零值PyRun_AnyFileExFlags()
在Python/pythonrun.c
將exit()
在 事件的一個SystemExit
異常,如果 腳本設置退出代碼將不會返回。它只會返回非零值,如果 是內部錯誤。所以run_file()
的返回值是什麼使得腳本0
的默認退出碼。
感謝ShadowRanger。 Martin Broadhurst的答案(通過代碼追蹤更多)證實了Py_Main文檔。 –