Когда я запускаю следующий код:
def read_args():
parser = default_parser()
parser.add_argument('--tensorboard-dir', type=str, default='/tmp/cifar10/tensorboard')
parser.add_argument('-N', type=int, default=50000, help = "Use N training examples.")
return parser.parse_args()
def main():
flags = readargs()
У меня есть следующий вывод ошибки:
Требуются следующие аргументы: --name
Однако, когда я добавляю аргумент --name:
def read_args():
parser = default_parser()
parser.add_argument('--name', type=str, default='cifar10test')
parser.add_argument('--tensorboard-dir', type=str, default='/tmp/cifar10/tensorboard')
parser.add_argument('-N', type=int, default=50000, help = "Use N training examples.")
return parser.parse_args()
def main():
flags = readargs()
также создает проблему.
Есть идеи?
Ошибка также показывает «использование». Что это такое?
ошибка означает, что вы должны запустить скрипт как script.py --name some_value . Вероятно, в default_parser() у вас есть add_argument('--name', ...). Запустите script.py --help, чтобы увидеть все аргументы.
Когда вы попытались добавить свой аргумент --name, в чем была ошибка? Я подозреваю, что он жаловался на противоречивое определение. Это подтвердило бы идею о том, что default_parser уже определил --name (как и требовалось).
@Tomerikoo Уважаемый Tomerikoo, метод парсера по умолчанию содержит огромное количество переменных-аргументов, и я не добавлял его, потому что подумал, что это может сбивать с толку. Хотите, чтобы я добавил метод default_parser?
@AhmetTavli Нет, не нужно ставить все это здесь. Просто проверьте, есть ли там уже аргумент --name, что, скорее всего, так и есть...






Похоже, что default_parser содержит обязательный аргумент --name. То, что вы делаете во втором примере, определяет аргумент дважды - один раз в default_parser и один раз в вашей программе. Вместо этого вы должны передавать аргумент --name при вызове вашей программы из командной строки.
Пример:
python cifar.py -N=1200 --tensorboard-dir=file.txt --name=cool_name
В качестве альтернативы вы можете удалить default_parser и создать свой собственный ArgumentParser:
`parser = argparse.ArgumentParser()`
Полная рабочая демонстрация:
import argparse
def read_args():
parser = argparse.ArgumentParser()
parser.add_argument('--tensorboard-dir', type=str,
default='/tmp/cifar10/tensorboard')
parser.add_argument('-N', type=int, default=50000,
help = "Use N training examples.")
return parser.parse_args()
def main():
flags = vars(read_args())
# You can access your args as a dictionary
for key in flags:
print("{} is {}".format(key, flags[key]))
main()
Парсер возвращает объект Пространство имен, но мы можем получить доступ к его (гораздо более простому) внутреннему словарю, используя vars(Namespace). Затем вы можете получить свои аргументы, обратившись к словарю, например, flags['N']. Обратите внимание, что tensorboard-dir становится tensorboard_dir внутри вашей программы Python чтобы избежать проблем с оператором вычитания.
Вызовите его из командной строки (я использую Bash):
python cifar.py -N=1200 --tensorboard-dir=file.txt
Выход:
tensorboard_dir is file.txt
N is 1200
Как кто-то указал в комментариях к вопросу, я думаю, вы импортируете default_parser() откуда-то еще. Если вы включите источник, кто-то может помочь, но я предполагаю, что у него есть обязательный аргумент --name. Если это так, вам нужно добавить этот аргумент при вызове программы из командной строки, а не пытаться переопределить его, добавив в качестве другого аргумента.
Ему не нужно делать что-то sys.argv[1:], потому что это по умолчанию. print(flags) достаточно, чтобы увидеть пространство имен. Но ничто из этого не устраняет ошибку «--name».
Учитывая, что он понятия не имел, что такое --name, и не ссылался на него где-либо еще, я предположил, что он не хотел этого и просто повторно использовал фрагмент кода. Вы правы насчет sys.argv (я не очень хорошо знаком с argparse) - я полностью обновляю ответ, чтобы отразить это.
что такое
default_parser? Как именно вы это делаете? и, наконец, ошибка не говорит, что вам нужно определять аргументname, а Добавить в вызове командной строки. Если вы имеете в виду, что вы буквально запускаете приведенный выше код, то аргументы не передаются. измените наparser.parse_args([...])и заполните список аргументами, которые вы хотите передать (все строки)