使用Python argparse的递归
我正在用 argparse 写一个递归程序。这个程序唯一必须的参数是一个文件(或者多个文件)来处理。当我递归调用它时,我不需要文件名(因为我会在一个新的目录下调用),但我需要选项。问题是,argparse 允许两种调用方式:python programname.py -options arg FILENAME FILENAME
和 python programname.py FILENAME FILENAME -options arg
。我可以费力地去查找 '-' 并用很多 if 语句来处理,但我觉得应该有更好的方法。
不确定这是否重要,但这是我的 argparse 声明:
parser = argparse.ArgumentParser(description='Personal upload script. (defaults to ' + user + '@' + server + directory + ')')
parser.add_argument('files', nargs="+", help='file(s) to upload')
parser.add_argument('-s', metavar='example.com', default=server, help='server to upload to')
parser.add_argument('-u', metavar='username', default=user, help='ftp username')
parser.add_argument('-p', metavar='password', default=password, help='ftp password')
parser.add_argument('-d', metavar='example/', default=directory, help='directory to place file in')
parser.add_argument('-n', metavar='myfile.txt', help='name to save file as')
parser.add_argument('-c', metavar='###', help='chmod upload')
parser.add_argument('-l', action='store_true', help='print out new url(s)')
parser.add_argument('-r', action='store_true', help='recursive')
parser.add_argument('-F', action='store_true', help='force (overwrite files / create non-existing dirs)')
parser.add_argument('-v', action='store_true', help='verbose')
args = parser.parse_args()
非常感谢!
2 个回答
1
你可能不应该在进程级别上使用递归。不过,我觉得argparse对“--”的处理可能正是你需要的工具(如果我理解得没错的话)。可以去argparse的文档里搜索一下“--”这个字符串。
7
你这样做只是在给自己添麻烦。程序本身并不是递归的,递归的是函数。如果让整个程序都变成递归的,可能会导致内存不足,甚至让系统崩溃。
你应该重写你的应用程序,把递归的工作限制在一个可以自我调用的函数里,而不是让整个应用程序再启动一个实例。
更好的做法是完全去掉递归。看起来你只是想遍历一个目录树,没有必要用递归的方式来做。实际上,Python有一个库函数可以帮你自动遍历目录树,叫做os.walk。你可以查看这个链接了解更多信息:os.walk。