在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入门篇之条件、循环
Oct 17 Python
Python使用迭代器捕获Generator返回值的方法
Apr 05 Python
Python计算两个日期相差天数的方法示例
May 23 Python
python实现关键词提取的示例讲解
Apr 28 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
python 实现保存最新的三份文件,其余的都删掉
Dec 22 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
Pycharm中如何关掉python console
Oct 27 Python
python切割图片的示例
Nov 12 Python
python 判断字符串当中是否包含字符(str.contain)
Jun 01 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
德劲1103的维修打理经验
2021/03/02 无线电
ip签名探针
2006/10/09 PHP
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
php上传文件常见问题总结
2015/02/03 PHP
php实现paypal 授权登录
2015/05/28 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
php-fpm重启导致的程序执行中断问题详解
2019/04/29 PHP
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
javascript 实现map集合
2015/04/03 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
Js apply方法详解
2017/02/16 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
windows下安装python paramiko模块的代码
2013/02/10 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
2019年Java 最常见的 面试题
2016/10/19 面试题
杭州时比特电子有限公司SQL
2013/08/22 面试题
初中生三年学习生活的自我评价
2013/11/03 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
营销与策划实训报告
2014/11/05 职场文书
政协委员个人总结
2015/03/03 职场文书
健康证明
2015/06/19 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python