2014-04-04 34 views
0

我在python 2.6上運行我的腳本。要求如下所述。我們可以發送一個元組作爲python的sys.exit()的參數:

在一個目錄中有大約100個測試腳本(所有的python腳本)。我必須創建一個主python腳本,它將開始逐個運行所有100個測試腳本,然後顯示測試用例是否失敗。每個腳本都會調用sys.exit()來完成腳本的執行。目前,我正在閱讀主腳本中的sys.exit()值,並確定特定測試用例是否失敗。

但現在有一個需求更改,我還必須顯示日誌文件名(我將在運行腳本時創建日誌文件)。那麼我可以發送一個元組作爲參數(它包含狀態以及日誌文件名)到sys.exit()而不是發送整數值嗎?

我在網上讀過,如果我們傳遞一個整數以外的參數,None等價於傳遞零,而其他任何對象都打印到stderr並且導致退出代碼爲1.所以如果我傳遞一個元組作爲一個說法,即使在成功的情況下,os也會被視爲失敗,因爲我沒有通過None

我在主腳本中使用subprocess.popen()來運行腳本,我使用format()來讀取sys.exit()的值。

+0

甲UNIX進程的退出狀態是單字節的整數值。即使您通過了其他任何事情,也無法將其用作退出狀態。 –

+1

@CharlesDuffy Python [允許](https://docs.python.org/2/library/sys.html#sys.exit)將_any_對象傳遞給'sys.exit',這樣你也可以傳遞,例如,字符串來方便地設置一個錯誤信息被打印到'stderr'。它強制非整數對象退出狀態1。 –

+0

@ Two-Bit Alchemist,......這個陳述與我所說的沒有任何矛盾。 –

回答

3

不,你不能。 sys.exit()設置進程退出代碼,就是這樣。沒有關於進程使用該代碼執行其他任何操作的規定,但將其設置爲整數。

可以寫數據到sys.stdoutsys.stderr,和你的主腳本可以從這些流讀取

當然,如果你通過(從None分開或整數)任何其他類型的對象,以sys.exit()它會寫,作爲一個字符串sys.stderr你,但在這種情況下,退出代碼爲總是會設置爲1;您不再控制退出狀態。在顯式寫入輸出流之後,最好明確地設置退出狀態。

只需使用,無論是stdoutstderr設置爲subprocess.PIPE,然後使用Popen.communicate() method從該管道流中讀取的數據:

proc = subprocess.Popen([executable, arg1, arg2], 
         stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = proc.communicate() 
status_code = proc.returncode 
+0

儘管我同意這可能是正確的做法,但您的答案會使您聽起來像不能給sys.exit()任何東西,而是一個整數,這與[文檔說的內容]相反( https://docs.python.org/2/library/sys.html#sys.exit)。你可以解釋嗎? –

+0

@ Two-BitAlchemist,正如文檔所言,非整數對象不被用作進程退出狀態,而是被打印到stderr(之後'1'被用作退出狀態)。 –

+0

@ Two-BitAlchemist:擴展我的答案。 –

2

是的,你是對的。傳遞一個元組將打印元組到stderr並以退出碼1返回。您必須返回None來表示成功。

注意這是一個shell和類似的約定,不是必需的。這就是說,由於非常非常好的原因,這些約定已經到位。

相關問題