2014-12-05 56 views
3

我試圖在python程序中運行一組bash腳本命令。我必須逐個運行命令並處理每個命令的錯誤和異常。爲此,我使用與call功能波紋管的subprocess模塊:在python中運行bash命令並處理錯誤

result = subprocess.call("echo testing", shell = True) 

預期這個命令打印「測試」和設置的result的值設置爲0,這意味着已成功執行的命令。或者,在以下命令的情況:

result = subprocess.call("echso testing", shell = True) 

它打印「/ bin/sh的:1:echso:未發現」,並設置的result到127的數值,這意味着命令echso是無效的。 我的問題是,我可以在哪裏找到這些錯誤編號的完整列表,以及可以用於錯誤處理的描述?到目前爲止,我發現一個退出錯誤列表如下:

1: general errors 
2: misuse of shell builtins (pretty rare) 
126: cannot invoke requested command 
127: command not found error 
128: invalid argument to 「exit」 
128+n: fatal error signal 「n」 (for example, kill -9 = 137) 
130: script terminated by Ctrl-C 

這是全部,還是你知道更多的錯誤代碼與描述?

+1

該列表中你是因爲它得到一樣好。每個程序都可以自由使用它想要的任何退出代碼。除了「非零等於錯誤」之外,你實在無法依賴任何東西。也就是說,你可以捕獲'stderr'並提供給用戶。 – kindall 2014-12-05 14:42:54

+1

可能的重複http://stackoverflow.com/questions/1101957/are-there-any-standard-exit-status-codes-in-linux – runDOSrun 2014-12-05 14:45:36

回答

0

bash手冊頁有一個部分3.7.5 Exit Status,其中涵蓋了您指定的值(儘管我沒有在其中看到130)。

除此之外,我不知道有什麼好的標準。

sysexits.h但我不確定有多少人實際使用它(也可在Linux上使用)。

+0

這就是爲什麼我更喜歡另一種解決方案。它至少可以處理所有的情況 – vks 2014-12-05 14:51:39

+0

@vks不,它不處理所有的情況。處理不寫入stderr但返回失敗返回碼的內容。 – 2014-12-05 15:02:16

-1
result = subprocess.Popen("echo testing", shell = True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
output,err=result.communicate() 
if output: 
    print "success" 
else: 
    print err 

而不是找到錯誤的數字,你可以直接找到錯誤,並處理它們。

+1

這不是問題的答案。 – 2014-12-05 14:40:03

+0

這是如何回答他可以在哪裏找到shell的退出編碼器列表的問題? – RedX 2014-12-05 14:40:17

+0

這給你從運行命令標準錯誤(我相信)並不總是相同的事情。 – 2014-12-05 14:43:02

0

你幾乎提到了所有這些。一個更詳盡的列表給出here,這裏是關於他們每個人的一些有用的信息:

reserved exit codes

According to the above table, exit codes 1 - 2, 126 - 165, and 255 have special meanings, and should therefore be avoided for user-specified exit parameters. Ending a script with exit 127 would certainly cause confusion when troubleshooting (is the error code a "command not found" or a user-defined one?). However, many scripts use an exit 1 as a general bailout-upon-error. Since exit code 1 signifies so many possible errors, it is not particularly useful in debugging.

There has been an attempt to systematize exit status numbers (see /usr/include/sysexits.h), but this is intended for C and C++ programmers. A similar standard for scripting might be appropriate. The author of this document proposes restricting user-defined exit codes to the range 64 - 113 (in addition to 0, for success), to conform with the C/C++ standard. This would allot 50 valid codes, and make troubleshooting scripts more straightforward.

Out of range exit values can result in unexpected exit codes. An exit value greater than 255 returns an exit code modulo 256. For example, exit 3809 gives an exit code of 225 (3809 % 256 = 225).