2016-04-19 56 views
0

我有一個由korn shell腳本調用的python腳本。如果python腳本遇到錯誤,korn shell腳本仍然以0退出。如何讓python腳本告訴ksh它沒有正確終止?如何將錯誤退出代碼從python腳本傳遞到調用它的KSH腳本?

說唱歌手腳本是這樣的:

python2.7 python_script.py ${inargument} >> ${log_file} 2>&1 

exit_code=$?        

if [ ${exit_code} -ne 0 ] 
    then 
    echo "Python script failed" >> ${log_file} 
fi 
+1

在shell腳本中你可以做'echo「Returncode = $?」' –

+0

你可以顯示你的shell腳本嗎?如果shell腳本的最後一個命令運行Python腳本,那麼shell應該退出,出錯狀態與Python腳本相同。 (如果你在Python腳本的調用之後有任何東西,例如你的shell中有一個日誌語句,那麼它可能是該行的退出狀態被返回)。 –

+0

@CharlesDuffy我添加了shell腳本的詳細信息。它應該捕獲.py腳本的退出狀態,但我似乎忽略了某些內容。 –

回答

0

環繞你整個腳本在try塊和漁獲寫錯誤到了放文件。與你的ksh相比,你可以閱讀那個輸出文件並做你所需要做的事情。

這裏是一些僞代碼。

rm opFile 
python yourSript.py 
if opFile != blank: 
    process log file... 
    start cat runlog.m | more 
+0

哦,這不適合你嗎? – kpie

+0

我不能說第一個downvoter,但爲我自己說話,這不是一個問題,它是否有效:有一個標準實踐的方式來做到這一點,並忽略該慣例(在C99標準中定義,在POSIX標準和其他地方)沒有好的理由是......好吧,不是好的做法。 –

+0

+ @nephlm提供了最好的答案,在ksh想要使用python優雅地失敗,在失敗之前可能嘗試多個事情的用例中,創建一個記錄通過執行的路徑的runlog文件是我所知道的標準做法。 ..(事情是我不知道。) – kpie

4

我不知道KSH,但是這是你如何讓蟒蛇返回一個非零的返回值,我假設KSH可以檢測並面對這一切。

import sys 

retCode = 5 
sys.exit(retCode) 

retCode = -128 
raise SystemExit(retCode) 
+1

'-128'在這裏是無效的 - 它只是無符號的單字節整數,所以這將被轉換成別的東西而不是完整的返回。 –

+0

...另外,ksh的行爲與任何其他POSIX兼容shell在這方面的行爲完全相同,使用先前命令的退出狀態填充'$?'。 –

+0

(另外,參見'man 3 sysexits'獲取常規退出狀態代碼的列表;自定義值應該按照慣例低於「EX__BASE」常量64,並且對於錯誤狀態,高於「0」 (在C99中定義的'EXIT_SUCCESS'常量) –

0

因爲聲譽,我不能評論,但你絕對可以使用從nephim註釋代碼。

1)只是把所述第一的nephim的代碼在test.py (chmod 700 test.py

2)本KSH腳本運行test.py:

#!/usr/bin/ksh 

./test.py 

exit $? 

3)這是例如由命令行

> ./test.ksh 
> echo $? 
5 

PS:你應該chmod 700 test.ksh以及。

P.P.S:可能我誤解了你的問題。 如果你的python腳本在到達結尾之前退出(所以它不執行sys.exit(codeRet)命令),在這種情況下,你應該使用try..execpt結構。

try : 
    <some code> 
except <Error to Catch>: 
    sys.exit(codeRet) 

按如下說明:Python: about catching ANY exception你甚至可以捕獲所有異常的:

try: 
    do_something() 
except: 
    print "Caught it!" 

但作爲解釋說: 「你可以,但你不應該」

更新: @ AlexKinman 我認爲你的python有一些問題......正如tripleee提到的,它可能是一些包裝? 可不可以給的which python2.7

這裏我的測試返回:

$#貓wrong_test.ksh

#!/bin/ksh 

log_file=log.txt 

python -c 'raise Exception("foo")' >> ${log_file} 2>&1 

exit_code=$?        

if [ ${exit_code} -ne 0 ] 
    then 
    echo "Python script failed" >> ${log_file} 
fi 

$#貓的日誌。TXT 回溯(最近通話最後一個): 文件 「」,1號線,在 例外:富 Python腳本未能

$#貓good_test.ksh

#!/bin/ksh 

log_file=log1.txt 

python -c 'print "Hello"' >> ${log_file} 2>&1 

exit_code=$?        

if [ ${exit_code} -ne 0 ] 
    then 
    echo "Python script failed" >> ${log_file} 
fi 

$# cat log1.txt
你好

+0

如果解釋器由於異常而退出,默認情況下它將有一個非零的退出狀態 - 你不需要捕獲它並調用'sys.exit()' –

+0

......你可以自己測試一下:'python -c'raise Exception(「foo」)'; echo $?' –

+0

@CharlesDuffy問題我沒有得到非零的默認退出狀態。代碼在我的python解釋器中,如果我傳遞了錯誤的輸入參數,我會得到一個錯誤,但是當我使用KSH運行時,它不會向KSH傳遞任何東西。 –

相關問題