在ipython notebook中使用argparse方式

ipython notebook经常被我用作debug的工具。今天调试一段代码,里面用到了argparse这个包来解析命令行参数。但是在ipython notebook里,命令行参数与实际执行的时候是完全不同的,因此代码没办法直接跑起来。

首先查看parse_args()函数的文档,发现函数接口长这样:ArgumentParser.parse_args(args=None, namespace=None)。这个args要求什么类型并没有说,不过文档最后有一句:“默认情况下,参数字符串取自于sys.argv,并创建一个空的Namespace对象用于保存属性”。那就好办了,只要args长得跟sys.argv一样就行。

如果在ipython notebook里,sys.argv可能是这样的:

['/home/user/venv/lib/python2.7/site-packages/ipykernel/__main__.py','-f','/run/user/1000/jupyter/kernel-7b35f85c-27c9-44db-bcf7-e46edb18ee81.json']

这是一个字符串组成的列表,每个字符串显然来源于命令行参数,用空格分开。那么我们只要稍微改动一下代码,给parse_args()输入一个列表即可。假设运行时的命令行参数是python train.py --gpus 0 --lr 0.1,那么传入的列表就是['--gpus', '0', '--lr', '0.1']

补充知识:jupyter notebook:使用argparse包存在的问题及解决

argparse模块

argparse是python用于解析命令行参数和选项的标准模块

导入argparse包

import argparse

遇到的问题

parser = argparse.ArgumentParser()
parser.parse_args()

usage: __main__.py [-h]
__main__.py: error: unrecognized arguments: -f /run/user/1006/jupyter/kernel-ce6cfb61-acb9-40bf-a59b-ff6e1c1eacae.json

An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

问题分析

由于在jupyter notebook中,args不为空,可以查看系统环境变量,大概是下面形式

import sys
sys.argv

['/home/liu/anaconda2/lib/python2.7/site-packages/ipykernel/__main__.py',
'-f',
'/run/user/1006/jupyter/kernel-ce6cfb61-acb9-40bf-a59b-ff6e1c1eacae.json']

可以看出,错误中的-f /…来自这里,可以查看parse_args()函数源码

以及和其调用的函数parse_known_args()源码

虽然args默认参数为None,但是实质为args = _sys.argv[1:]

所以在jupyter中,可以查看自己需要的系统环境变量,然后以list的数据形式传参给args则可以了

parser.parse_args??
parser.parse_known_args??

Signature: parser.parse_args(args=None, namespace=None)
Source:
 def parse_args(self, args=None, namespace=None):
 args, argv = self.parse_known_args(args, namespace)
 if argv:
  msg = _('unrecognized arguments: %s')
  self.error(msg % ' '.join(argv))
 return args
File: /home/liu/anaconda2/lib/python2.7/argparse.py
Type: instancemethod

Signature: parser.parse_known_args(args=None, namespace=None)
Source:
 def parse_known_args(self, args=None, namespace=None):
 if args is None:
  # args default to the system args
  args = _sys.argv[1:]
 else:
  # make sure that args are mutable
  args = list(args)

 # default Namespace built from parser defaults
 if namespace is None:
  namespace = Namespace()

 # add any action defaults that aren't present
 for action in self._actions:
  if action.dest is not SUPPRESS:
  if not hasattr(namespace, action.dest):
   if action.default is not SUPPRESS:
   setattr(namespace, action.dest, action.default)

 # add any parser defaults that aren't present
 for dest in self._defaults:
  if not hasattr(namespace, dest):
  setattr(namespace, dest, self._defaults[dest])

 # parse the arguments and exit if there are any errors
 try:
  namespace, args = self._parse_known_args(args, namespace)
  if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
  args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))
  delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)
  return namespace, args
 except ArgumentError:
  err = _sys.exc_info()[1]
  self.error(str(err))
File: /home/liu/anaconda2/lib/python2.7/argparse.py
Type: instancemethod

问题解决

parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args(args=[])
print(args)

Namespace(verbosity=None)

argparse参考文档

以上这篇在ipython notebook中使用argparse方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • jupyter notebook参数化运行python方式

    Updates (2019.8.14 19:53)吃饭前用这个方法实战了一下,吃完回来一看好像不太行:跑完一组参数之后,到跑下一组参数时好像没有释放之占用的 GPU,于是 notebook 上的结果,后面好几条都报错说 cuda out of memory. 现在改成:将 notebook 中的代码写在一个 python 文件中,然后用命令行运行这个文件,比如: # autorun.py import os # print(os.getcwd()) over = [ # 之前手工改参数跑完的参数

  • 在ipython notebook中使用argparse方式

    ipython notebook经常被我用作debug的工具.今天调试一段代码,里面用到了argparse这个包来解析命令行参数.但是在ipython notebook里,命令行参数与实际执行的时候是完全不同的,因此代码没办法直接跑起来. 首先查看parse_args()函数的文档,发现函数接口长这样:ArgumentParser.parse_args(args=None, namespace=None).这个args要求什么类型并没有说,不过文档最后有一句:"默认情况下,参数字符串取自于sys

  • 在jupyter notebook中调用.ipynb文件方式

    正常来说在jupyter notebook 中只能调用.py文件,要想要调用jupyter notebook自己的文件会报错. Jupyter Notebook官网介绍了一种简单的方法: http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/Importing%20Notebooks.html 添加jupyter notebook解析文件 首先,创建一个python文件,例如Ipynb_importer.py,代码如

  • ipython jupyter notebook中显示图像和数学公式实例

    1. # 可以使用LaTeX表示数学公式 # 可以使用LaTeX表示数学公式 from IPython.display import Latex Latex(r"$\sqrt{x^2+y^2}$") 2. # SymPy的表达式也可以显示为LaTex %load_ext sympyprinting from sympy import * x, y = symbols("x,y") sqrt(x**2+y**2) 3. # 用Image类显示"jupyter

  • jupyter notebook中美观显示矩阵实例

    我就废话不多说了,还是直接看代码吧! from IPython.display import display,Latex,Math %matplotlib inline from IPython.core.interactiveshell import InteractiveShell sh = InteractiveShell.instance() def number_to_str(n,cut=5): ns=str(n) format_='{0:.'+str(cut)+'f}' if 'e'

  • 解决Jupyter notebook中.py与.ipynb文件的import问题

    在jupyter notebook中,因为其解析文件的方式是基于json的,所以其默认保存的文件格式不是.py而是.ipynb.而.ipynb文件并不能简单的import进.py或者.ipynb文件中,这就为开发带来了极大不便.因为在jupyter notebook中,一定要是在默认的.ipynb下才能有一系列的特性支持,比如自动补全,控制台等待,而.py文件只能通过文本编辑器修改,非常非常不便. 因为.ipynb可以import .py的module,所以其中一个解决方法是将已经写好的.ipy

  • jupyter notebook中新建cell的方法与快捷键操作

    jupyter notebook中,你可能需要在当前cell的上面或下面添加新的cell,通过菜单栏.工具栏和快捷键可以实现 菜单栏: 工具栏: 但工具栏中的+号只能在当前cell的下方加新的cell 快捷键: 在当前cell上方新建cell:A 在当前cell下方新建cell:B 注意: 大写状态下的A和小写状态下的a都可以 快捷键方式都是要在非编辑状态下按下才有用 非编辑状态: 编辑状态: 编辑状态下可以按Esc到非编辑状态 另外,有两个经常会用到的快捷键: 执行当前cell,并自动跳到下一

  • 如何实现在jupyter notebook中播放视频(不停地展示图片)

    在解决图像处理问题的时候,可以利用opencv打开视频,并一帧一帧地show出来,但是要用到imshow(),需要本地的界面支持. 代码如下 # -*- coding:utf-8*- import cv2 capture = cv2.VideoCapture("D:\\dataset\\chip_gesture.ts") # 图像处理函数 def processImg(img): # 画出一个框 cv2.rectangle(img, (500, 300), (800, 400), (0

  • Jupyter Notebook内使用argparse报错的解决方案

    Jupyter Notebook内使用argparse报错 在github上下载了代码来学习时,发现将其直接copy到jupyter notebook里时总是出现如下报错: 在翻阅了大量博客后,发现关键问题出在以下语句: args = parser.parse_args() 按照博文的提示,原以为将其改成如下形式就可以: args = parser.parse_args(args[]) 但仍然报错: 不过好在互联网的广阔,让我又翻到了两个解决方案,ps:第二个解决方案在打印args的时候不会出现

  • Jupyter notebook中5个有趣的魔法命令分享

    目录 1.脚本代码写入本地文件 2.执行Py文件 3.监测代码运行时间 4.使用系统命令行 5.快速debug 知识点补充 众​所周知,Jupyter notebook是一个交互式的Python shell,也就是IPython的封装版,非常适合用来进行数据分析和机器学习. Jupyter notebook中有很多实用且鲜为人知的功能,可以实现有趣的操作 这次举5个简单的例子. 1.脚本代码写入本地文件 %%file方法可以将脚本代码写入本地Py文件. %%file E:\hello.py de

随机推荐