Jupyter Notebook中的Argparse抛出TypeError

时间:2018-06-08 14:38:31

标签: python jupyter-notebook argparse

在Jupyter Notebook中使用argparse会引发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 :(得分:1)

Ipython在后台运行一些命令行参数。这干扰了argparse和optparse。

请参阅this bug for Spyder(Ipython IDE),其中-f被添加为命令选项并崩溃,因为-f没有处理程序。

您可以尝试检查当前正在播放的参数(就像他们为Spyder错误所做的那样)并设置虚拟处理程序。

运行

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-7023575cfccc。 JSON']

Argparse assumes the first entry is the program namesys.argv[0])。为了解决这个问题,我不得不打电话给

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

...现在argparse可以在我的笔记本中使用。

答案 1 :(得分:0)

一种解决方案是解析一个空的参数列表:

old_str

另一种方法是使用parse_known_args:

import argparse

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

args = parser.parse_args([])

答案 2 :(得分:0)

当我在Notebook中运行代码时,出现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关键字错误。如果你需要帮助,你必须给我们追溯。