Python获取命令行参数后进行处理的时候为什么不能进到else中,请大神赐教哈

 手机用户2502871803 发布于 2022-10-28 18:29
# 获取命令行参数
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)
        
2 个回答
  • 因为在下面这句就已经报异常了:

    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处理正常参数的输入。

    2022-10-30 02:54 回答
  • 真正的原因是当你不带参数运行脚本时, 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

    2022-10-30 02:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有