在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 正则式 概述及常用字符
May 07 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
django drf框架中的user验证以及JWT拓展的介绍
Aug 12 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 Python
简单的Python人脸识别系统
Jul 14 Python
Python必须了解的35个关键词
Jul 16 Python
Django如何继承AbstractUser扩展字段
Nov 27 Python
Python3中对json格式数据的分析处理
Jan 28 Python
python使用pymysql模块操作MySQL
Jun 16 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
与数据库连接
2006/10/09 PHP
PHP 事务处理数据实现代码
2010/05/13 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
设定php简写功能的方法
2019/11/28 PHP
js身份证验证超强脚本
2008/10/26 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
django 多数据库配置教程
2018/05/30 Python
详解Python time库的使用
2019/10/10 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
python 如何实现遗传算法
2020/09/22 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
计算机网络专业个人的自我评价
2013/10/17 职场文书
幼儿园园长岗位职责
2013/11/26 职场文书
开工仪式主持词
2014/03/20 职场文书
转让协议书范本
2014/04/15 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书