Argparse疑问:sys.argv[1]与args.input的区别及代码报错求助
解决argparse使用问题&区分sys.argv与args.input
我来帮你一步步搞定这个问题,先把你的argparse代码修好,再给你掰清楚两者的区别~
一、修复你的argparse代码
你写的注释掉的argparse代码有两个关键问题,导致无法正常运行:
- 语法错误:
parser.add_argument那一行末尾少了一个闭合的括号,Python会直接报错; - 参数类型不匹配:你用了
nargs='+',这会让args.input变成一个列表(用来接收多个输入路径),但原来的代码是把sys.argv[1](单个字符串)赋值给path,直接用args.input赋值会导致后续处理出错。
修复后的完整代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import argparse import sys import glob # 修正语法错误,完善参数定义 parser = argparse.ArgumentParser() parser.add_argument('-input', dest='input', help="input one or more directories", nargs='+', metavar='PATH') args = parser.parse_args() def dirlist(path, c = 1): for i in glob.glob(os.path.join(path, "*")): if os.path.isfile(i): filepath, filename = os.path.split(i) print ('----' *c + filename) elif os.path.isdir(i): dirname = os.path.basename(i) print ('----' *c + dirname) c+=1 dirlist(i,c) c-=1 # 因为nargs='+',args.input是列表,这里取第一个路径(如果要支持多个目录,可循环遍历列表) path = os.path.normpath(args.input[0]) print(os.path.basename(path)) dirlist(path)
现在运行python Test.py -input .就能正常打印目录结构啦!如果想同时处理多个目录,比如python Test.py -input ./dir1 ./dir2,只需要加个循环:
for input_path in args.input: path = os.path.normpath(input_path) print(os.path.basename(path)) dirlist(path)
二、sys.argv[1]和args.input的核心区别
这俩都是获取命令行参数,但处理方式和灵活性差很多:
sys.argv:原始的参数列表
sys.argv是Python启动脚本时,传入的所有命令行参数的原始字符串列表,第一个元素永远是脚本的文件名(比如Test.py),后面的是用户输入的所有内容,没有任何解析。
比如你运行python Test.py -input .,sys.argv就是['Test.py', '-input', '.']——这时候sys.argv[1]是'-input',不是你要的路径,这也是为什么你之前用sys.argv时必须直接传python Test.py .(此时sys.argv[1]才是.)。
它的优点是简单直接,缺点是完全需要自己处理参数的格式、选项和值的对应,稍微复杂点的命令行就容易出错。args.input:argparse解析后的结构化参数
argparse是Python官方的命令行参数解析库,它会帮你处理:- 选项(比如
-input)和对应参数值的绑定; - 参数格式校验(比如
nargs='+'确保至少有一个输入); - 自动生成帮助信息(运行
python Test.py -h就能看到你写的help内容); - 支持多种参数类型(比如布尔值、整数、文件路径等)。
像你定义的nargs='+',argparse会自动把用户输入的所有路径收集到args.input这个列表里,不用你自己去拆分sys.argv,代码更健壮也更易维护。
- 选项(比如
内容的提问来源于stack exchange,提问作者Francesco Mantovani
相关产品推荐
相关产品推荐

