在ipython notebook中使用argparse方式


Posted in Python onApril 20, 2020

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方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python概率计算器实例分析
Mar 25 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
python 函数传参之传值还是传引用的分析
Sep 07 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
python中的decimal类型转换实例详解
Jun 26 Python
pycharm重命名文件的方法步骤
Jul 29 Python
Django 迁移、操作数据库的方法
Aug 02 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python多进程并行代码实例
Sep 30 Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 Python
Python实现自动整理文件的脚本
Dec 17 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
Python绘制全球疫情变化地图的实例代码
Apr 20 #Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 #Python
python实现小程序推送页面收录脚本
Apr 20 #Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 #Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 #Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 #Python
解决Python spyder显示不全df列和行的问题
Apr 20 #Python
You might like
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
js event事件的传递与冒泡处理
2009/12/06 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
JS继承 笔记
2011/07/13 Javascript
JS编程小常识很有用
2012/11/26 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
图解js图片轮播效果
2015/12/20 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
使用webpack3.0配置webpack-dev-server教程
2018/05/29 Javascript
搭建vue开发环境
2018/07/19 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
学习python (1)
2006/10/31 Python
python避免死锁方法实例分析
2015/06/04 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
完美主义个人的自我评价
2014/02/17 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
捐款感谢信
2015/01/20 职场文书
教师岗位职责范本
2015/04/02 职场文书
Java死锁的排查
2022/05/11 Java/Android