带有 Args 解析器的 Jupyter Notebook

Posted

技术标签:

【中文标题】带有 Args 解析器的 Jupyter Notebook【英文标题】:JupyterNotebook with Args Parser 【发布时间】:2018-03-10 16:57:15 【问题描述】:
parser = argparse.ArgumentParser()
parser.add_argument('-model', type=str, default='linear_model')
parser.add_argument('-featuredim', type=int, default=20)
parser.add_argument('-inputfeatures', type=str, default='/Users/myname/Downloads/face-rating-master/data/features_ALL.txt')
parser.add_argument('-labels', type=str, default='/Users/myname/Downloads/face-rating-master/data/ratings.txt')

以上代码可以成功运行。下面一行

args = parser.parse_args()

给出这个错误:

usage: ipykernel_launcher.py [-h] [-model MODEL] [-featuredim FEATUREDIM]
                             [-inputfeatures INPUTFEATURES] [-labels LABELS]
ipykernel_launcher.py: error: argument -featuredim: invalid int value: '/Users/myname/Library/Jupyter/runtime/kernel-7d72fc3c-2c11-47e4-87f3-3587b2461a52.json'
An exception has occurred, use %tb to see the full traceback.

来自https://github.com/avisingh599/face-rating的代码

【问题讨论】:

在笔记本中你没有命令行是吗?您希望它从哪里获取要解析的参数? 真的。笔记本上有什么解决方法吗? 你可以试试 args = parser.parse_args(args=[]) 【参考方案1】:
try:
    args = parser.parse_args() #call from command line
except:
    args = parser.parse_args(args=[]) #call from notebook

【讨论】:

请添加上下文以便我们学习。请记住,这是一个较旧的问题,因此由于代码的演变,版本号在您的答案中很重要。 EOR。欢迎并享受 SO :-) 这对我有用。在笔记本中执行时似乎没有传入命令行参数(duh!)【参考方案2】:

featuredim 参数需要一个整数(即type=int),但您已传入一个字符串,该字符串指示 json 文件的路径。

您可以通过稍微重新设计其逻辑来使该脚本工作,以便它可以读取 JSON,然后从键值中提取整数(类似于在 .ini 配置文件中读取多少脚本),但是在你正在做的事情的背景下,这是矫枉过正的(而且真的对你的困境没有多大帮助,因为你想使用 Jupyter)。作为参考,您传递给脚本的文件不会让您直接访问笔记本中定义的变量,而只是存储应用程序使用的信息(例如运行笔记本的 IP 地址和它正在使用的 TCP 端口号)。为了说明,这是我笔记本电脑上类似 JSON 文件的样子:

09/28 18:26:53 [jsp2205@kaheta: ~/Library/Jupyter/runtime]
$ less kernel-40dad791-ffa1-4687-bcd1-3ec831884c83.json

  "stdin_port": 60476,
  "ip": "127.0.0.1",
  "control_port": 60477,
  "hb_port": 60478,
  "signature_scheme": "hmac-sha256",
  "key": "b52ef99c-0a1a70b17b600daea5263a29",
  "kernel_name": "",
  "shell_port": 60474,
  "transport": "tcp",
  "iopub_port": 60475

最好的办法是从 trainModel.py 中获取代码,删除 ArgumentParser,然后用硬编码的变量替换对参数的任何引用。然后将修改后的代码中的每一行添加到您的 Jupyter notebook 中,并在 notebook 中手动修改硬编码的变量。

对于使用 ArgumentParser 的其他脚本,您可能想查看它们是否将使用 parse_args() 提取的参数传递给函数,然后使用类似于以下的导入语句将该函数直接导入笔记本。所以类似于以下内容:

cd [directory containing script]
from [script name minus the .py extension] import [function name]

【讨论】:

以上是关于带有 Args 解析器的 Jupyter Notebook的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jupyter notebook 中运行 parse_args()?收到错误 SystemExit: 2

带有多级解析器/子解析器的 Argparse 可选参数

带有所需子解析器的 Argparse

无法从 Anaconda Navigator (Windows) 启动 Jupyter Note

jupyter notebook 的使用说明 转自 http://blog.csdn.net/tina_ttl/article/details/51031113#pythonjupyter-note

默认解析器的身份验证/授权