命令行参数随后argparse选项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命令行参数随后argparse选项相关的知识,希望对你有一定的参考价值。

我是新来的蟒蛇,目前玩弄argpase。我试图使用给出一个命令行参数后跟argparse选项(-name)的目录路径,并通过目录中的所有文件,并去吐出所有的比赛,以正则表达式作为这样一个正则表达式来调用一个函数:

./find.py ../seek -name '[a-z]*.txt'

但是,我得到的是看起来像一个错误

usage: find.py [-h] [--path PATH] [-name] [--regex REGEX] find.py: error: unrecognized arguments: . . / s e e k / p r o g r a m . c

而没有-name它只是打印路径下的所有文件。

这是我到目前为止有:

#!/usr/bin/python2.7

import os, sys, argparse,re 
from stat import *

def parse(argv=None):
   parser = argparse.ArgumentParser()
   parser.add_argument('--path', help='path of directory', action='store')
   parser.add_argument('-name', '--name', action='store_true')
   parser.add_argument('--regex', default=r"[a-z0-9A-Z]")
   args = parser.parse_args(argv)
   print(args)
   return args

def main(argv=None):

   direc = sys.argv[1]
   files = []

   for f in os.listdir(direc):
      pathname = os.path.join(direc, f)
      mode = os.stat(pathname).st_mode

      if S_ISREG(mode):  
         args = parse(pathname)      
         if args.name:  
            dirls = [re.match(args.regex, pathname)]
            print(dirls)
         else:
            print pathname

if __name__ == '__main__':main() 

有什么想法吗?

答案

为了让你的程序来操作,你需要一个路径。因此,--path选项必须采用参数。修改您的parse()功能改变线

parser.add_argument('--path', help='path of directory', action='store')

parser.add_argument('--path', help='path of directory', action='store', required=True)

你需要调用parse_args()只有一次。取下parse()调用到循环的顶部。

而你不用做

direc = sys.argv[1]

如果您正在使用argparse

re.match()返回match object,这可能不是你想要打印的内容。

你可能想看看match() versus search()

match()功能仅在RE在字符串开始处匹配,而search()将通过字符串匹配向前扫描检查。

如果您想打印匹配正则表达式的文件名,你可以这样做

  if S_ISREG(mode):  
     #args = parse(pathname)      
     if args.name:  
        #dirls = re.match(args.regex, pathname)
        dirls = re.search(args.regex, pathname)
        if( dirls ):
           print(pathname)
     else:
        print pathname

所以main()应该是这样

def main(argv=None):
    args = parse(sys.argv[1:])
    print(args)
    #direc = sys.argv[1]
    direc = args.path
    files = []

    for f in os.listdir(direc):
      pathname = os.path.join(direc, f)
      mode = os.stat(pathname).st_mode

    if S_ISREG(mode):  
       #args = parse(pathname)      
       if args.name:  
          #dirls = re.match(args.regex, pathname)
          dirls = re.search(args.regex, pathname)
          if( dirls ):
             print(pathname)
       else:
          print pathname

为了指定正则表达式匹配的文件名,你必须指定使用--regex选项的正则表达式。默认情况下,你做它来搭配只有数字和(英文)字母的名字。

./find.py --path ../seek -name --regex [a-z]*.txt

要么

./find.py --path ../seek -name --regex '[a-z]*.txt'
另一答案

参数分析器PATH实施例:不同类型的参数与自定义处理程序添加。对于路径在这里,你可以通过“-path”后跟路径值作为参数

import os
import argparse
from datetime import datetime


def parse_arguments():
    parser = argparse.ArgumentParser(description='Process command line arguments.')
    parser.add_argument('-path', type=dir_path)
    parser.add_argument('-e', '--yearly', nargs = '*', help='yearly date', type=date_year)
    parser.add_argument('-a', '--monthly', nargs = '*',help='monthly date', type=date_month)

    return parser.parse_args()


def dir_path(path):
    if os.path.isdir(path):
    return path
    else:
    raise argparse.ArgumentTypeError(f"readable_dir:{path} is not a valid path")


def date_year(date):
    if not date:
    return

    try:
    return datetime.strptime(date, '%Y')
    except ValueError:
    raise argparse.ArgumentTypeError(f"Given Date({date}) not valid")


def date_month(date):
    if not date:
    return

    try:
    return datetime.strptime(date, '%Y/%m')
    except ValueError:
    raise argparse.ArgumentTypeError(f"Given Date({date}) not valid")


def main():
    parsed_args = parse_arguments()

if __name__ == "__main__":
main()

以上是关于命令行参数随后argparse选项的主要内容,如果未能解决你的问题,请参考以下文章

[Python系列-25]:argparse --- 命令行选项参数解析器

Python技法:用argparse模块解析命令行选项

parser.add_argument()用法——命令行选项参数和子命令解析器

如何使用 argparse 将列表作为命令行参数传递?

python 解析命令行选项

python使用argparse解析命令行参数