Argparse в Jupyter Notebook генерирует ошибку TypeError - PullRequest
0 голосов
/ 08 июня 2018

Использование argparse в блокноте Jupyter приводит к возникновению ошибки TypeError.Тот же код работает нормально, если я выполняю тот же код, что и скрипт.MWE:

import argparse

parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('--name', '-n', default='foo', help='foo')

args = parser.parse_args()

Результат:

TypeError: 'level' is an invalid keyword argument for this function

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Одним из решений является синтаксический анализ пустого списка аргументов:

import argparse

parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('--name', '-n', default='foo', help='foo')

args = parser.parse_args([])

Другим решением является использование parse_known_args:

args, _ = parser.parse_known_args()
0 голосов
/ 08 июня 2018

Когда я запускаю ваш код в блокноте, я получаю сообщение об ошибке использования argparse:

usage: ipykernel_launcher.py [-h] [--name NAME]
ipykernel_launcher.py: error: unrecognized arguments: -f /run/user/1000/jupyter/kernel-a6504c0c-bed2-4405-8704-c008f52dcba6.json

С print(sys.argv) я получаю

['/home/paul/.local/lib/python3.6/site-packages/ipykernel_launcher.py', '-f', '/run/user/1000/jupyter/kernel-a6504c0c-bed2-4405-8704-c008f52dcba6.json']

sys.argv, который parser анализирует, содержит значения, используемые для запуска сервера Notebook, который этот конкретный parser не настроен для обработки.

parser.parse_known_args() отображает:

(Namespace(name='foo'),
 ['-f',
  '/run/user/1000/jupyter/kernel-a6504c0c-bed2-4405-8704-c008f52dcba6.json'])

Этот дополнительный материал, который не может обработать ваш анализатор, занесен в список extras.

Запуск с пользовательским argv список работает:

parser.parse_args(['-n', 'foobar'])
Namespace(name='foobar')

Хорошая идея поместить код argparse (по крайней мере, строку parse_args) в блок __main__, поэтому он не запускается, когдаСкрипт импортирован.Он все равно будет работать, когда скрипт запускается как скрипт.

if __name__ == '__main__':
    import argparse

    parser = argparse.ArgumentParser(description='Foo')
    parser.add_argument('--name', '-n', default='foo', help='foo')

    args = parser.parse_args()
    print(args)

Этот скрипт также работает при использовании %run stack50763033.py.Вы можете даже дать ему аргументы, как если бы вы использовали скрипт:

%run stack50763033.py -n testing

Я понятия не имею, какой код вызывает ошибку ключевого слова level.Вы должны будете дать нам трассировку, если вам нужна помощь с этим.

0 голосов
/ 08 июня 2018

Ipython запускает некоторые аргументы командной строки в фоновом режиме.Это влияет на argparse и optparse.

См. эту ошибку для Spyder (Ipython IDE), где -f добавлялся в качестве опции команды и завершался сбоем, так как не было обработчика для -f.

Вы можете попробовать проверить аргументы, которые в данный момент находятся в игре (как они это делали для ошибки Spyder), и установить фиктивный обработчик на место.

Run

import sys
print(sys.argv)

внутри Ipython и посмотрите, что он выводит.

В моей системе он выдает

['/ usr / lib / python3.6 / site-packages / ipykernel_launcher.py', '-f ',' /run/user/1000/jupyter/kernel-7537e4dd-b5e2-407c-9d4c-7023575cfc7c.json']

Argparse предполагает, что первой записью является имя программы (sys.argv[0]).Чтобы это исправить, мне пришлось позвонить

parser = argparse.ArgumentParser(prog='myprogram', description='Foo')

... и теперь argparse работает в моей записной книжке.

...