我试图返回状态码而不退出进程我的剧本。是否有一个与sys.exit()等价且不停止执行的?
我希望发生什么:
如果没有引发异常,状态码默认为0。对于较小的例外,我想返回状态码1,但保持进程运行,除非有更严重的错误退出进程并返回状态码2和sys.exit(2)
。在我的例子中,我循环遍历一堆PDF文件,如果一个文件由于某种原因没有被匿名,我想在循环遍历其余文件时返回状态码1。
- 0 - SUCCESS:所有文件已成功匿名
- 1 -警告:至少有一个文件没有被匿名
- 2 - ERROR:严重错误,进程中断
为清楚起见:这里的状态码是指Bash命令echo $?
在执行脚本后返回的内容。
我做了什么:我已经尝试使用sys.exit(1)
来处理轻微的异常,但它会自动停止执行,如库文档中所述。
总结代码片段:
对于给定的main.py
:
import sys
import os
def anonymiser(file) -> Boolean :
# Returns True if successfully anonymises the file, False otherwise
...
def process_pdf_dir():
for file in os.listdir('pdf_files/'):
if file.endswith('.pdf'):
if anonymiser(file) == False:
'''
Here goes the code to change status code to 1
but keeps looping through the rest of the files
unlike `sys.exit(1)` that would stop the execution.
'''
if criticalError = True:
sys.exit(2)
if __name__ == '__main__':
process_pdf_dir()
在终端上调用脚本后,像这样回显其状态:
$ python main.py
$ echo $?
如果是,至少有一个文件没有被匿名化:
预期输出(如果没有严重错误):
1
预期输出(如果发生严重错误):
2
当前输出(如果没有严重错误):
0
当前输出(如果严重错误):
2
希望这足够清楚。任何帮助都将非常感激。谢谢。
等到循环结束时返回1退出代码。我想这样做:
def process_pdf_dir() -> int:
ret = 0
for file in os.listdir('pdf_files/'):
if file.endswith('.pdf'):
if not anonymiser(file):
# remember to return a warning
ret = 1
if criticalError:
# immediately return a failure
return 2
return ret
if __name__ == '__main__':
sys.exit(process_pdf_dir())
If "critical error"包括未捕获的异常,可以放在process_pdf_dir
之外,例如:
if __name__ == '__main__':
try:
sys.exit(process_pdf_dir())
except:
sys.exit(2)