在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实现的ini文件操作类分享
Nov 20 Python
Python中对列表排序实例
Jan 04 Python
Python中分数的相关使用教程
Mar 30 Python
python将文本分每两行一组并保存到文件
Mar 19 Python
Python中一些不为人知的基础技巧总结
May 19 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Python 存储字符串时节省空间的方法
Apr 23 Python
python ctypes库2_指定参数类型和返回类型详解
Nov 19 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
scrapy-splash简单使用详解
Feb 21 Python
anaconda python3.8安装后降级
Jun 11 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
4.与数据库的连接
2006/10/09 PHP
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
Json解析的方法小结
2016/06/22 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
2018/03/29 Javascript
JavaScript笛卡尔积超简单实现算法示例
2018/07/30 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
Python实现的爬虫功能代码
2017/06/24 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
Python 切分数组实例解析
2019/11/07 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
如何用JQuery进行表单验证
2013/05/29 面试题
2014年关于两会精神的心得体会
2014/03/17 职场文书
学生保证书范文
2014/04/28 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
python 安全地删除列表元素的方法
2022/03/16 Python