argparse的目录路径类型

我的python脚本需要从命令行中传递的目录中读取文件。我定义了一个与argparse一起使用的以下read_dir类型,用于验证在命令行中传递的目录是否存在并且可读。此外,还为目录参数指定了默认值(在以下示例中为/

tmp /

non_existent_dir)。这里的问题是,即使在命令行中显式传递了目录参数的情况下,argparse也会在默认值上调用read_dir()。这将导致脚本出现错误,因为默认路径/

tmp / non_existent_dir在命令行中显式传递目录的上下文中不存在。我可以通过不指定默认值并将此参数设置为强制性来解决此问题,

#!/usr/bin/python

import argparse

import os

def readable_dir(prospective_dir):

if not os.path.isdir(prospective_dir):

raise Exception("readable_dir:{0} is not a valid path".format(prospective_dir))

if os.access(prospective_dir, os.R_OK):

return prospective_dir

else:

raise Exception("readable_dir:{0} is not a readable dir".format(prospective_dir))

parser = argparse.ArgumentParser(description='test', fromfile_prefix_chars="@")

parser.add_argument('-l', '--launch_directory', type=readable_dir, default='/tmp/non_existent_dir')

args = parser.parse_args()

回答:

您可以创建自定义操作而不是类型:

import argparse

import os

import tempfile

import shutil

import atexit

class readable_dir(argparse.Action):

def __call__(self, parser, namespace, values, option_string=None):

prospective_dir=values

if not os.path.isdir(prospective_dir):

raise argparse.ArgumentTypeError("readable_dir:{0} is not a valid path".format(prospective_dir))

if os.access(prospective_dir, os.R_OK):

setattr(namespace,self.dest,prospective_dir)

else:

raise argparse.ArgumentTypeError("readable_dir:{0} is not a readable dir".format(prospective_dir))

ldir = tempfile.mkdtemp()

atexit.register(lambda dir=ldir: shutil.rmtree(ldir))

parser = argparse.ArgumentParser(description='test', fromfile_prefix_chars="@")

parser.add_argument('-l', '--launch_directory', action=readable_dir, default=ldir)

args = parser.parse_args()

print (args)

但这对我来说似乎有点麻烦-如果没有给出目录,它将传递一个不可读的目录,这似乎使检查目录是否首先可访问的目的无法实现。

请注意,正如评论中指出的那样,它可能

raise argparse.ArgumentError(self, ...)比更好argparse.ArgumentTypeError

据我所知,没有办法验证默认参数。我想argparse开发人员只是假设,如果您提供默认值,那么它应该是有效的。最快,最简单的方法是在解析参数之后立即对参数进行验证。看起来,您只是在尝试获取一个临时目录来执行一些工作。如果是这样,您可以使用该tempfile模块来获取一个新目录以供使用。我在上面更新了我的答案以反映这一点。我创建一个临时目录,将其用作默认参数(tempfile已经保证它创建的目录是可写的),然后我将其注册为在程序退出时将其删除。

以上是 argparse的目录路径类型 的全部内容, 来源链接: utcz.com/qa/417481.html

回到顶部