在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 功能和特点(新手必学)
Dec 30 Python
Python随机读取文件实现实例
May 25 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
朴素贝叶斯Python实例及解析
Nov 19 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
Django 实现图片上传和显示过程详解
Jul 18 Python
如何在Django项目中引入静态文件
Jul 26 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
Mar 28 Python
在Django中自定义filter并在template中的使用详解
May 19 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
python保存图片的四个常用方法
Feb 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+SqlServer实现分页显示
2006/10/09 PHP
关于时间计算的结总
2006/12/06 PHP
8个出色的WordPress SEO插件收集
2011/02/26 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
Python中的with...as用法介绍
2015/05/28 Python
python中的编码知识整理汇总
2016/01/26 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
pymongo中group by的操作方法教程
2019/03/22 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
幼儿教育感言
2014/02/05 职场文书
电大本科自我鉴定
2014/02/05 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
Python实现视频自动打码的示例代码
2022/04/08 Python
python中使用redis用法详解
2022/12/24 Redis