在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虚拟环境Virtualenv使用教程
May 18 Python
Python通过select实现异步IO的方法
Jun 04 Python
详解Python核心对象类型字符串
Feb 11 Python
python验证身份证信息实例代码
May 06 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
Python3日期与时间戳转换的几种方法详解
Jun 04 Python
解析python实现Lasso回归
Sep 11 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
PyTorch如何搭建一个简单的网络
Aug 24 Python
Pycharm制作搞怪弹窗的实现代码
Feb 19 Python
Python图像处理之图像拼接
Apr 28 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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
PHP中动态HTML的输出技术
2006/10/09 PHP
php木马攻击防御之道
2008/03/24 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
总结Python编程中函数的使用要点
2016/03/20 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
python机器学习之决策树分类详解
2017/12/20 Python
python实现ID3决策树算法
2018/08/29 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
基于python plotly交互式图表大全
2019/12/07 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
制药工程专业毕业生推荐信
2013/12/24 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
店面出租协议书范本
2014/11/28 职场文书
军训决心书范文
2015/09/22 职场文书
MySQL创建管理KEY分区
2022/04/13 MySQL