argparse的目录路径类型
我的python脚本需要从命令行中传递的目录中读取文件。我定义了一个与argparse一起使用的以下read_dir类型,用于验证在命令行中传递的目录是否存在并且可读。此外,还为目录参数指定了默认值(在以下示例中为/
tmp /
non_existent_dir)。这里的问题是,即使在命令行中显式传递了目录参数的情况下,argparse也会在默认值上调用read_dir()。这将导致脚本出现错误,因为默认路径/
tmp / non_existent_dir在命令行中显式传递目录的上下文中不存在。我可以通过不指定默认值并将此参数设置为强制性来解决此问题,
#!/usr/bin/pythonimport 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 argparseimport 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