Подтвердить что ты не робот

Python argparse: непризнанные аргументы

Когда я запускаю parsePlotSens.py -s bw hehe, он говорит, что hehe является непризнанным аргументом. Однако, если я запустил parsePlotSens.py hehe -s bw, это нормально. В идеале я бы хотел, чтобы он работал в обоих случаях.

Какие-нибудь советы? Ниже приведен мой код:

if __name__ == '__main__' :

    parser = argparse.ArgumentParser(prog='parsePlotSens');
    parser.add_argument('-s', '--sort', nargs =1, action = 'store', choices = ['mcs', 'bw'], default='mcs', help=sorthelp)
    parser.add_argument('filename', nargs ='+', action = 'store')
    option = parser.parse_args(sys.argv)
4b9b3361

Ответ 1

Не передавайте sys.argv в качестве аргумента parse_args. Просто используйте

option = parser.parse_args()

Если вы передаете sys.argv в parse_args, то путь или имя самого script является первым элементом в sys.argv и, таким образом, становится значением option.filename. Затем hehe становится неизвестным аргументом.

Если вы опускаете sys.argv, то parse_args анализирует sys.argv, как ожидалось.

Ответ 2

Вы можете обойти это, разрешив неизвестные аргументы

Заменить

args = parser.parse_args()

с

args, unknown = parser.parse_known_args()

Ответ 3

Кроме того, в качестве дополнения к ответу unutbu, хранение аргументов в словаре таким образом облегчает тесты:

args = vars(parser.parse_args())
print args

Печать словаря:

{'sort': ['bw'], 'filename': ['hehe']}

Вроде:

if args['sort'] == 'bw':
    # code here

...

Ответ 4

Чтобы завершить этот ответ, я приведу пример для получения и анализа неизвестных аргументов:


import argparse

parser = argparse.ArgumentParser()
# we only have a know argument  as key-pair --known KNOWN
parser.add_argument('--known')

# test with known un unknown variables
args, unknown = parser.parse_known_args(["--known", "var", "--unknown", "bar", "--flag"])

unknown возвращает список, подобный ["--unknown", "bar", "--flag"]. Нам просто нужно разобрать это:

keypairs = dict([unknown[i:i+2] for i in range(0, len(unknown), 1) if unknown[i].startswith("--") and not (unknown[i+1:i+2]+["--"])[0].startswith("--")])

flags = [unknown[i] for i in range(0, len(unknown), 2) if (unknown[i+1:i+2]+["--"])[0].startswith("--")]

Ответ 5

Моя ситуация не совпадает с вопросом, но ошибка та же.

Моя ситуация:

  1. У меня есть удаленный разработчик (SFTP) с Windows Pycharm, и загрузить для запуска с Linux.
  2. у команды python есть разрыв строки с \ в моем файле bash, например

    python args_config.py \
        --arg1="hello" \
        --arg2="world"
    

и поднять ошибку python argparse: unrecognized arguments args not found.

проблема в том, что разрыв строки файла bash различается в Windows и Linux,

просто настройка с помощью pycharm File -> Line Separators -> LF - Unix and OS X (\n)

загрузить в Linux и запустить файл Bash, все работает!