2010-12-15 76 views
6

在Python(在Linux系統上)中,我使用os.system()啓動命令並檢索返回碼。如果返回碼不是0,我想用相同的返回碼退出程序。所以我寫了:如何繞過python中sys.exit()的0-255範圍限制?

ret = os.system(cmd) 
if ret != 0: 
    print "exit with status %s" % ret 
    sys.exit(ret) 

當返回碼大於256時,它工作正常,但是當它大於255時,所使用的退出代碼爲0。我怎樣才能讓sys.exit()接受更大的代碼比255?

編輯:極限實際上255

是事實上,ret可變接收256,但sys.exit()無法使用它,所以程序返回0代替。當我手動啓動cmd,我看到它返回1,不是256,我

回答

0

作品(CentOS的5.5,Python的2.6.5):

$ python 
>>> import sys 
>>> sys.exit(245) 
$ echo $? 
245 
+0

這是不正確的,它不測試同樣的事情。 – unwind 2010-12-15 09:27:54

+0

對不起,我的錯誤,限制是255,而不是127. – 2010-12-15 09:36:37

+2

255限制由shell執行:http://tldp.org/LDP/abs/html/exit-status.html和http:// tldp。 org/LDP/abs/html/exitcodes.html – 2010-12-15 09:38:38

2

不能 不應該,因爲系統自身保留高於128的退出碼。如果返回代碼是從0到127,則表示程序本身退出。如果返回碼高於128,則意味着程序被系統信號(例如SIGKILL或SIGTERM)終止。信號編號是結果代碼減去128.

你需要檢測它並做出其他類型的輸出指示,我想。也許將返回代碼打印到STDOUT,然後返回0(正常退出,正常輸出)或1(cmd具有非零返回值,輸出意味着什麼)。

編輯:顯然(從this comment),Python是不是一個shell腳本更聰明......把它恢復成常規的Linux退出代碼,試試這個:

subprocess_exit_code = (ret >> 8) & 0x7f 
subprocess_signal_number = ret & 0xff 

if subpprocess_signal_number == 0: 
    exit_code = subprocess_exit_code 
else: 
    exit_code = 128 + subprocess_signal_number 

雖然這忽略了核心 - 轉儲信息。

5

實際上,documentation表示

退出狀態指示:一個16位的數,其低字節是殺死處理的信號數量,並且其高字節爲退出狀態(如果該信號數字爲零);如果生成核心文件,則設置低字節的高位。

所以我需要處理(),以獲取真正的退出狀態,像這樣由sys.exit返回的數字:

ret = os.system(cmd) 
# Ignore the first byte, use the second one only 
ret = ret >> 8 
if ret != 0: 
    print "exit with status %s" % ret 
    sys.exit(ret) 

而現在它的工作原理:滯留包含1個,而不是256

+0

哦。我剛開始想知道爲什麼它會在segfaulty終止時返回0x8b00。 – ulidtko 2010-12-15 09:45:26

+0

我認爲如果它轉儲核心,將給你一個不同的退出代碼,如果你從命令行運行它,你會得到什麼。 – 2010-12-15 09:53:01

+1

你可以使用'subprocess.call'而不是'os.system':compare'python -c'import os;打印[os.system([「。/ exit-with「,str(i)])for i in [127,128,255,256,257]]''和'python -c'import subprocess print [subprocess.call([」./ exit-with「,str(i)] )for i in [127,128,255,256,257]]''where'exit-with'是http://ideone.com/zFelC – jfs 2010-12-15 10:05:40