Python argparse命令行选项报错求助:使用-name选项触发错误
解决argparse命令行选项出错的问题
嘿,作为Python新手碰到argparse的问题太正常了,我猜你大概率是在配置-name参数的时候踩了坑,加上可能对shell通配符的处理有点混淆,才导致了这个错误。
先看你的错误提示argument regex:——十有八九是你在定义-name参数时,错误地把它的type设置成了正则编译(比如type=re.compile),但你传入的是shell通配符模式[0-9]*\.txt,不是合法的正则表达式(或者说没按正则规则写),这就触发了参数解析时的正则编译错误。
给你一个适配需求的完整示例代码,你可以对比下自己的代码哪里不一样:
import argparse import os import fnmatch def main(): # 初始化解析器 parser = argparse.ArgumentParser(description='搜索指定目录下匹配名称的文件') # 位置参数:必填的目标目录 parser.add_argument('directory', help='要搜索的目标目录路径') # 可选参数:文件名匹配模式(支持通配符) parser.add_argument('-name', help='要匹配的文件名通配符模式,比如[0-9]*.txt') # 解析命令行参数 args = parser.parse_args() # 遍历目标目录下的所有文件 for root, _, files in os.walk(args.directory): for filename in files: # 如果没指定-name就全输出,否则匹配模式 if not args.name or fnmatch.fnmatch(filename, args.name): print(os.path.join(root, filename)) if __name__ == '__main__': main()
然后给你拆解关键点:
- 参数定义:这里
-name只是普通的字符串参数,没有设置特殊的type,因为我们用fnmatch来处理通配符(和shell的匹配规则一致),不需要提前编译正则。 - shell通配符处理:你用单引号包裹
'[0-9]*\.txt'是完全正确的,这样shell不会提前展开这个模式,而是把完整的字符串传给脚本,让fnmatch来处理。如果去掉单引号,shell会先在当前目录找符合该模式的文件,把文件名列表传给脚本,这就不是你要的递归搜索效果了。
如果你的初衷是想用正则表达式而不是通配符,那可以调整代码:把fnmatch.fnmatch换成re.match,同时参数定义改成parser.add_argument('-name', type=re.compile),但这时候你传入的模式要改成正则写法,比如'^\d+\.txt$'(匹配纯数字开头的txt文件)。
最后,用你原来的命令测试这个脚本:./find.py ../Python -name '[0-9]*\.txt',应该就能正常输出符合条件的文件路径了。
内容的提问来源于stack exchange,提问作者ajax
相关产品推荐
相关产品推荐

