# 获取命令行参数 opts,args = getopt.getopt(sys.argv[1:],"hi:n:o:s:d:") #function to show help information when user input "-h" def usage(): print ("sys.argv[0]: ' -i p_case_dir -n p_case_id_str -o p_out_dir -s p_src_conn -d p_dst_conn'") print ("sys.argv[0]: ' -h'") for op,value in opts: if(op == "-i"): p_case_dir = value elif(op == "-n"): p_case_id_str = value elif(op == "-o"): p_out_dir = value elif(op == "-s"): p_src_conn = value elif(op == "-d"): p_dst_conn = value elif(op == "-h"): usage() os._exit(0) else: usage() os._exit(0)
因为在下面这句就已经报异常了:
opts,args = getopt.getopt(sys.argv[1:],"hi:n:o:s:d:")
需要提前捕捉异常:
try: opts,args = getopt.getopt(sys.argv[1:],"hi:n:o:s:d:") except getopt.GetoptError: print('This options is not supported.') exit(-1)
然后在你的if/elif/else处理正常参数的输入。
真正的原因是当你不带参数运行脚本时, opts, args = getopt.getopt(sys.argv[1:], "hi:n:o:s:d:")
这句得到的opts = []
, 即一个空的list
且并不像楼上说的会报异常错误, 而对于一个空的list
来说, 你这句for op,value in opts:
是不会进入到for
循环中去的, 自然也不会触发else
的逻辑。
我们做个测试:
lst = [] for i in lst: if i: print(i) else: print("hello") # 结果为空, for循环并没有执行 lst = [0] for i in lst: if i: print(i) else: print("hello") # 列表非空, 可迭代, 正常进入else
所以你这代码应该改写为:
# coding=utf8 import getopt import sys def usage(): print("{}: '-i p_case_dir -n p_case_id_str -o p_out_dir -s p_src_conn -d p_dst_conn'".format(sys.argv[0])) def main(): try: opts, args = getopt.getopt(sys.argv[1:], "hi:n:o:s:d:") except getopt.GetoptError as e: print(e) usage() sys.exit(1) if opts: for op, value in opts: if (op == "-i"): p_case_dir = value elif (op == "-n"): p_case_id_str = value elif (op == "-o"): p_out_dir = value elif (op == "-s"): p_src_conn = value elif (op == "-d"): p_dst_conn = value else: usage() sys.exit(1) else: usage() sys.exit(1) if __name__ == "__main__": main()
另外从Python 2.7开始, 更为灵活方便的argparse
被纳入标准库, 所以建议用来代替getopt
官网manual