python try ... кроме обработки аргументов из пользовательского ввода - PullRequest
0 голосов
/ 06 марта 2019

мой файл python будет читать два файла из командной строки, используя argparse.Я хочу использовать «попробовать ... кроме ...» для обработки неправильного ввода пользователя, например, несуществующего файла и неправильной команды: например, я использую «-f» для открытия файла, тогда «-g» - неправильная команда.

мои коды:

> parser = argparse.ArgumentParser(description = "Handle with input 
files")
parser.add_argument('-m', dest = "model", type=argparse.FileType('r'))
parser.add_argument('-t', dest = "test", type=argparse.FileType('r'))
parser.add_argument('-d', dest = "permute",type=argparse.FileType('r'))
args = parser.parse_args()

# Parse file names from command line

model_file = open(args.model.name)
test_file = open(args.test.name)
decoy_file = open(args.permute.name)

Я пытаюсь реализовать в моем коде слово «попробуй ... кроме», но не получилось.Вот что я сделал:

> parser = argparse.ArgumentParser(description = "Handle with input 
files")
parser.add_argument('-m', dest = "model", type=argparse.FileType('r'))
parser.add_argument('-t', dest = "test", type=argparse.FileType('r'))
parser.add_argument('-d', dest = "permute",type=argparse.FileType('r'))
args = parser.parse_args()

# Parse file names from command line
try:
model_file = open(args.model.name)
test_file = open(args.test.name)
decoy_file = open(args.permute.name)
except IOError:
print('Wrong file name')

Ответы [ 3 ]

1 голос
/ 06 марта 2019

Я бы предложил добавить что-то вроде этого, чтобы убедиться, что все аргументы присутствуют. Также argparse.FileType('r') уже откроет файл (что означает, что вы можете сделать что-то вроде args.model.readlines()).

if not all([args.model, args.test, args.permute]):
    print("All Arguments are required")
    exit(1)
0 голосов
/ 06 марта 2019

Если вы не хотите, чтобы синтаксический анализатор ловил и выходил из поврежденных файлов, откройте файлы самостоятельно. Просто спросите парсер об именах, а не об открытых файлах.

parser = argparse.ArgumentParser(description = "Handle with input files")
parser.add_argument('-m', dest = "model")    # no type
parser.add_argument('-t', dest = "test")
parser.add_argument('-d', dest = "permute")
args = parser.parse_args()
# print(args)   # good idea when debugging

# Open file names from command line
try:
    model_file = open(args.model)
    test_file = open(args.test)
    decoy_file = open(args.permute)
except IOError:
    print('Wrong file name')
0 голосов
/ 06 марта 2019

Во-первых, ошибка произошла на args = parser.parse_args() при разборе параметра вашей команды.

Как мы видим из argparse's origin code:

    ...
    def parse_args(self, args=None, namespace=None):
        args, argv = self.parse_known_args(args, namespace)
        if argv:
            msg = _('unrecognized arguments: %s')
            self.error(msg % ' '.join(argv))
        return args
    ...
    def error(self, message):
        """error(message: string)

        Prints a usage message incorporating the message to stderr and
        exits.

        If you override this in a subclass, it should not return -- it
        should either exit or raise an exception.
        """
        self.print_usage(_sys.stderr)
        args = {'prog': self.prog, 'message': message}
        self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
        # exit here ,that's why can not catch the exception

Таким образом, когда вы вводите неправильно, как то, что вы упомянули выше, например non-exist file или incorrect command, в конце он вызовет функцию error и выйдет из потока, поэтому вы не можете перехватить исключение с помощью try .. except synax.

Если вы хотите перехватить исключение, вы можете унаследовать основной класс ArgumentParser и переписать метод error. Вы можете взять мои коды в качестве ссылки:


import argparse
import sys as _sys
from argparse import ArgumentParser


class ArgumentParserSub(ArgumentParser):
    def error(self, message):
        self.print_usage(_sys.stderr)
        args = {'prog': self.prog, 'message': message}
        raise Exception(('error: %(message)s\n') % args)


parser = ArgumentParserSub(description = "Handle with input files")
parser.add_argument('-m', dest = "model", type=argparse.FileType('r'))
parser.add_argument('-t', dest = "test", type=argparse.FileType('r'))
parser.add_argument('-d', dest = "permute",type=argparse.FileType('r'))

try:
    args = parser.parse_args()
    # Parse file names from command line
    model_file = open(args.model.name)
    test_file = open(args.test.name)
    decoy_file = open(args.permute.name)

except Exception as e:
    print(e)
    print('Wrong file name')

...