【问题标题】:How to fix ipykernel_launcher.py: error: unrecognized arguments in jupyter?如何修复 ipykernel_launcher.py:错误:jupyter 中无法识别的参数?
【发布时间】:2018-07-25 13:21:10
【问题描述】:

在设置环境两天后,我正在关注这个 tensorflow tutorial,我终于可以使用 cmd 运行 premade_estimator.py

但是当我尝试在 jupyter notebook 中运行相同的代码时,我收到了这个错误:

usage: ipykernel_launcher.py [-h] [--batch_size BATCH_SIZE]
                             [--train_steps TRAIN_STEPS]

ipykernel_launcher.py: error: unrecognized arguments: -f C:\Users\david\AppData\Roaming\jupyter\runtime\kernel-4faecb24-6e87-40b4-bf15-5d24520d7130.json

发生异常,使用 %tb 查看完整的回溯。

SystemExit: 2

C:\Anaconda3\envs\python3x\lib\site-packages\IPython\core\interactiveshell.py:2918: 
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

我尝试使用以下方法修复它但没有成功:

pip install --ignore-installed --upgrade jupyter

pip install ipykernel
python -m ipykernel install

conda install notebook ipykernel
ipython kernelspec install-self

任何想法将不胜感激!谢谢!

【问题讨论】:

    标签: python python-3.x tensorflow jupyter-notebook jupyter


    【解决方案1】:

    你试过了吗:

    conda install ipykernel --name Python3
    python -m ipykernel install
    

    【讨论】:

    • 我刚试过,它告诉我:All requested packages already installed.
    • 你也升级内核了吗? pip install --upgrade ipykernel
    • 是的,我做到了,我正在阅读argparse 的文档,看看是否有问题。
    • 您是在尝试从 jupyter 笔记本运行 premade_estimator.py,还是将脚本内容复制到笔记本中的单元格?
    • @MiltonArangoG 我正在将脚本内容复制到笔记本中的一个单元格中。
    【解决方案2】:

    我明白了!我们得到错误的原因是因为这段代码使用了argparse,并且这个模块是用来编写用户友好的命令行界面的,所以看起来它与Jupyter Notebook有冲突。

    我在这个page找到了解决方案:

    我们要做的是:

    删除或评论这些行:

    parser = argparse.ArgumentParser()
    parser.add_argument('--batch_size', default=100, type=int, help='batch size')
    parser.add_argument('--train_steps', default=1000, type=int,
                        help='number of training steps')
    

    并替换args

    args = parser.parse_args(argv[1:])
    

    对于以这种方式使用库easydict 的字典:

    args = easydict.EasyDict({
        "batch_size": 100,
        "train_steps": 1000
    })
    

    使用easydict,我们可以访问字典值作为参数的属性。

    更新

    在这一年深入研究 python 之后,我发现这个问题的解决方案更加简单(我们不需要使用任何外部库或方法)。 argparse 只是从终端将参数传递给 python 脚本的众多方法之一。当我尝试在 jupyter notebook 中执行此操作时,显然这是行不通的。我们可以直接在函数中替换如下参数:

    funtion(batch_size=100, train_steps=1000)
    

    现在,如果我们的函数有很长的参数列表,我们可以使用*args**kargs

    *args 在函数中传递一个元组作为参数,对于这种情况,特别是:

    args = (100, 1000)
    function(*args)
    

    **kargs 将字典作为参数传递给我们的函数:

    kargs = {"batch_size": 100,
            "train_steps": 1000}
    function(**kargs)
    

    只要 google 一下,你就会发现如何同时使用它们的一个很好的解释,这里是我曾经研究过的 documentation

    【讨论】:

    • 非常感谢!遇到了同样的问题,这个帖子帮我解决了。
    • 或者直接使用parser.parse_args(args=[]),因为parse_args()会将_sys.argv[1:]作为args的默认参数,替换成空列表[]解决这个问题。
    【解决方案3】:

    更优雅的解决方案是:

    args, unknown = parser.parse_known_args()
    

    而不是

    args = parser.parse_args()
    

    【讨论】:

    • 这个答案像魅力一样解决了 Jupyter 中的 args 解析问题!但是你能解释一下吗?谢谢!
    【解决方案4】:

    我今天刚遇到这个问题,发现一个快速而愚蠢的解决方案是为 qtconsole/ipython 传递的 -f 参数插入一个参数处理器,但我们没有预料到。在parser.add_argument 结尾我输入:

    parser.add_argument("-f", "--fff", help="a dummy argument to fool ipython", default="1")
    

    我不使用-f参数,所以对我来说没有损失。

    我不想仅仅因为 ipython 在一台特定计算机上的工作流中突然出现就重新设计一个更大的参数处理框架......

    【讨论】:

    • :)) 感谢您提供简单而有趣的解决方案。它对我有用。
    【解决方案5】:

    我遇到了这个问题:

    from serial.tools.list_ports import main
    main()
    

    但它是串行导入的库

    所以我在我自己的目录中复制来自以下文件的文件: /usr/lib/python3/dist-packages/serial/tools

    并编辑添加:

    parser.add_argument("-f", "--fff", help="a dummy argument to fool ipython", default="1")
    

    就像 pauljohn32 (https://stackoverflow.com/users/1086346/pauljohn32) 所做的那样!

    现在在本地使用新文件:

    from list_ports import main
    main()
    

    效果很好!

    【讨论】:

      【解决方案6】:

      我收到更多“无法识别的参数”的错误: ipykernel_launcher: error: unrecognized arguments: --ip=127.0.0.1 --stdin=9008 --control=9006 --hb=9005 --Session.signature_scheme="hmac-sha256" --Session.key=b"2dd531d9" --shell=9007 --transport="tcp" --iopub=9009 --f=tmp-18240vZXCSGIbxxcJ.json An exception has occurred, use %tb to see the full traceback.

      对于每个无法识别的参数(即 ip、stdin、control、..),我添加了一行以将参数添加到我的 ArgParser(如 @pauljohn32 所建议的那样):

              ap.add_argument(
                  "-i", "--ip", help="a dummy argument to fool ipython", default="1")
              ap.add_argument(
                  "-s", "--stdin", help="a dummy argument to fool ipython", default="1")
              ap.add_argument(
                  "-c", "--control", help="a dummy argument to fool ipython", default="1")
              ap.add_argument(
                  "-b", "--hb", help="a dummy argument to fool ipython", default="1")
              ap.add_argument(
                  "-K", "--Session.key", help="a dummy argument to fool ipython", default="1")
              ap.add_argument(
                  "-S", "--Session.signature_scheme", help="a dummy argument to fool ipython", default="1")
              ap.add_argument(
                  "-l", "--shell", help="a dummy argument to fool ipython", default="1")
              ap.add_argument(
                  "-t", "--transport", help="a dummy argument to fool ipython", default="1")
              ap.add_argument(
                  "-o", "--iopub", help="a dummy argument to fool ipython", default="1")
      

      【讨论】:

        【解决方案7】:

        建议here 的另一个解决方案是将空字符串传递给parse_args 方法。

        例如:

        import argparse
        
        
        def arguments():
          parser = argparse.ArgumentParser(description='Example')
          
          return parser.parse_args("")
        

        上述解决方案实际上适用于google-colab。

        【讨论】:

        • 谢谢。 args = parser.parse_args("") 在 Jupyter Notebook 为我工作。
        猜你喜欢
        • 2020-10-25
        • 2021-10-03
        • 2022-08-23
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        • 2019-11-06
        • 1970-01-01
        相关资源
        最近更新 更多