2015-10-08 2 views
1

Я создаю программу как задание в своей школе, я все с этим справился, кроме одного. Мы должны сделать выход программы с разными кодами в зависимости от того, как это произошло. В моей программе я обрабатываю опции, используя «argparse», и когда я использую встроенные функции типа «версия», мне удалось переопределить код выхода, но если я напишу опцию, которая не существует, то она выиграла Не работай. Это дает мне сообщение «непризнанной ошибки» и выходит с кодом «0», мне нужно, чтобы он вышел с кодом 1. Есть ли все-таки сделать это? Я вел с собой орехи, боролся с ним в течение нескольких дней ...Python3 переопределить ошибку argparse

Заранее благодарим! /feeloor

ответ

0

Используйте sys.exit (returnCode) для выхода с конкретными кодами. Очевидно, что на linux-машинах вам не нужно иметь 8-битный сдвиг вправо, чтобы получить правильный код возврата.

+0

Вы, я знаю, что я могу переопределить ошибки argparse? Поскольку, когда параметр не распознается, он автоматически выходит с кодом ошибки 0, я хочу переопределить его, чтобы я мог его изменить, чтобы выйти с кодом 1 ... – feeloor

+0

используйте try except block, чтобы поймать ошибку и в зависимости от выхода исключения с разные коды ... подсказка: используйте методы, такие как sys.exc_info(), чтобы обнаружить тип исключения. –

0

Чтобы достичь чего-то подобного, наследуйте от argparse.ArgumentParser и воспользуйтесь методом exit (или, если хотите, способом error).

Например:

class Parser(argparse.ArgumentParser): 
    # the default status on the parent class is 0, we're 
    # changing it to be 1 here ... 
    def exit(self, status=1, message=None): 
     return super().exit(status, message) 
+0

Это то, что я думаю, мне нужно будет сделать, но мне нужно действительно увидеть, что такое ошибка, и в зависимости от ошибка дает код выхода, потому что, как я уже сказал, статус выхода «1» означает, когда параметры ошибочно введены, а «0» - это когда программа завершается успешно, а «2» - когда «команда» ошибается ... Надеюсь, вы понять, что я имею в виду, извините, если я немного неясен .. – feeloor

+0

Затем переопределите еще несколько методов на 'ArgumentParser', например,' error' ... инициатива и все такое ... – donkopotamus

+0

Вы это то, что я хочу делать, но Кажется, я не могу найти свое «имя» или как это сделать? Я довольно новичок в python извините .. – feeloor

0

Из Python argparse документации

https://docs.python.org/3/library/argparse.html#exiting-methods

16.4.5.9. Exiting methods 

ArgumentParser.exit(status=0, message=None) 

    This method terminates the program, exiting with the specified status and, if given, it prints a message before that. 

ArgumentParser.error(message) 

    This method prints a usage message including the message to the standard error and terminates the program with a status code of 2. 

Они оба получают message, и передать его. error добавляет usage и передает его на номер exit. Вы можете настроить оба в подклассе Parser.

Есть также примеры обнаружения ошибок и перенаправления файла unittest, test/test_argparse.py.

Проблемы с использованием try/except обертки является то, что error информации записывается в sys.stderr, а не включена в sys.exc_info.

In [117]: try: 
    parser.parse_args(['ug']) 
except: 
    print('execinfo:',sys.exc_info()) 
    .....:  
usage: ipython3 [-h] [--test TEST] [--bar TEST] test test 
ipython3: error: the following arguments are required: test 
execinfo: (<class 'SystemExit'>, SystemExit(2,), <traceback object at 0xb31fb34c>) 

Номер выхода доступен в exc_info, но не сообщение.

Один из вариантов - перенаправить sys.stderr в то же время, что и я, try/except блок.

Вот пример изменения метода exit и оберточной вызов в Ьгу блоке:

In [155]: 
def altexit(status, msg): 
    print(status, msg) 
    raise ValueError(msg) 
    .....: 
In [156]: parser.exit=altexit 

In [157]: 
try:      
    parser.parse_args(['--ug','ug','ug']) 
except ValueError:  
    msg = sys.exc_info()[1] 
    .....:  
usage: ipython3 [-h] [--test TEST] [--bar TEST] test test 
2 ipython3: error: unrecognized arguments: --ug 

In [158]: msg 
Out[158]: ValueError('ipython3: error: unrecognized arguments: --ug\n') 

Python позволяет мне заменить методы существующих объектов. Я не рекомендую это в производственном коде, но это удобно при попытке идеи. Я фиксирую ошибку (мой выбор ValueError произволен) и сохраните сообщение для последующего отображения или тестирования.

Как правило, тип ошибки (например, TypeError, ValueError и т. Д.) Является частью общедоступного API, но текст ошибки отсутствует. Он может быть уточнен с одного выпуска Python до следующего без особого уведомления. Таким образом, вы проверяете данные сообщения на свой страх и риск.

0

Я решил проблему catching SystemExit и определил, какую ошибку просто проверили и сравнили. Спасибо за помощь!