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)
Ответы
Ответ 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
Моя ситуация не совпадает с вопросом, но ошибка та же.
Моя ситуация:
- У меня есть удаленный разработчик (SFTP) с Windows Pycharm, и загрузить для запуска с Linux.
у команды 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, все работает!