gpt4 book ai didi

Python 参数解析器,在 -h 之前引发异常

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:28 24 4
gpt4 key购买 nike

我不知道为什么会这样。据我了解,在执行默认操作之前,用户至少有机会使用 -h。

import os, sys, argparse
class argument_parser():
# call on all our file type parsers in the sequence_anlysis_method

def __init__(self):
self.db_directory = os.path.dirname(os.path.abspath(sys.argv[0]))

"""A customized argument parser that does a LOT of error checking"""
self.parser = argparse.ArgumentParser(
prog="igblast")

general = self.parser.add_argument_group(
title="\nGeneral Settings")

general.add_argument(
"-x", '--executable',
default="/usr/bin/igblastn",
type=self._check_if_executable_exists,
help="The location of the executable, default is /usr/bin/igblastn")

self.args = self.parser.parse_args()

def _check_if_executable_exists(self,x_path):
if not os.path.exists(x_path):
msg = "path to executable {0} does not exist, use -h for help\n".format(x_path)
raise argparse.ArgumentTypeError(msg)
if not os.access(x_path, os.R_OK):
msg1 = "executable {0} does have not permission to run\n".format(x_path)
raise argparse.ArgumentTypeError(msg1)
else:
return x_path

if __name__ == '__main__':
argument_class = argument_parser()

现在,如果/usr/bin/igblastn 存在,那很好,但如果不存在,只需调用此程序就会在 self_check_if_executable_exists 中引发异常。

File "execution.py", line 220, in <module>
argument_class = ap()
File "/home/willisjr/utilities/pyig/src/arg_parse.py", line 159, in __init__
self.args = self.parser.parse_args()
File "/usr/local/lib/python2.7/argparse.py", line 1656, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "/usr/local/lib/python2.7/argparse.py", line 1678, in parse_known_args
default = self._get_value(action, default)
File "/usr/local/lib/python2.7/argparse.py", line 2203, in _get_value
raise ArgumentError(action, msg)
argparse.ArgumentError: argument -x/--executable: path to executable /usr/bin/igblastn does not exist, use -h for help

据我了解,用户总是有机会运行 --help 或 -h 或在采取任何导致此参数错误的操作之前。是我对arg解析器的理解不够清楚吗?

最佳答案

在 Python 2.7.3 中,在 parse_known_args 早期(由 parse_args 调用),默认值被插入到 namespace 中。

    # add any action defaults that aren't present
for action in self._actions:
if action.dest is not SUPPRESS:
if not hasattr(namespace, action.dest):
if action.default is not SUPPRESS:
default = action.default
if isinstance(action.default, basestring): # delayed in 3.3.1
default = self._get_value(action, default)
setattr(namespace, action.dest, default)

如果 default 是一个字符串,它将通过调用适当的 type_get_value 传递,在您的情况下为 _check_if_executable_exists。这会产生您看到的错误。

在 3.3.1 的新闻中 https://docs.python.org/3.3/whatsnew/changelog.html

Issue #12776, issue #11839: Call argparse type function (specified by add_argument) only once. Before, the type function was called twice in the case where the default was specified and the argument was given as well. This was especially problematic for the FileType type, as a default file would always be opened, even if a file argument was specified on the command line.

通过此更改,_get_value 调用被推迟到 parse_known_args 的末尾,并且只有在解析没有将其他值放在那里时才会调用(需要默认值) ).

    if isinstance(action.default, basestring):  # dropped in 3.3.1
default = self._get_value(action, default)

因此您的脚本在我的开发副本上按预期运行(使用“-h”)。我不完全确定哪个版本的 Python 有这个更正。

因此,在您可以运行更新的 Python 版本之前,您有责任确保 default 是一个有效值。即使有了这个错误修复,在将默认值提供给 add_argument() 调用之前,最好确保您的默认值有效。无论何时处理,无效的默认值都会让您的用户感到困惑。

关于Python 参数解析器,在 -h 之前引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23557678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com