作者:于晨晨
研究方向:nlp
发表于公众号:AI技术日常

在python代码文件中,通常需要传参,传参就需要经常使用argparse。使用argparse模块在py文件中是正常的,但是jupyter notebook就会报错。那么怎么避免在jupyter notebook中报错?怎么将命令行执行文件时的参数传递进来呢?报错的具体原因是什么呢?

一、使用命令行执行文件

假定一个python文件,test.py,具体代码如下:

import argparseparser = argparse.ArgumentParser()
parser.add_argument('--device', default='0,1', type=str, help='设置使用哪些显卡')
parser.add_argument('--no_cuda', action='store_true', help='不适用GPU进行训练')
args = parser.parse_args()
print(args)

在命令行执行命令:

python test.py --device 0 --no_cuda

得到正确的运行结果:

Namespace(device='0', no_cuda=True)

上面执行命令即使不传入参数,也可以正确的运行。传入参数,得到传入参数的正确结果。

二、使用jupyter notebook运行代码报错

使用jupyter notebook运行此代码,会得到下面的错误:

usage: ipykernel_launcher.py [-h] [--device DEVICE] [--no_cuda]
ipykernel_launcher.py: error: unrecognized arguments: -f /dfsdata2/yucc1_data/.husky_cache/app_yucc1_1589251364792/jupyterlab_data_dir/runtime/kernel-3e12adb6-7cd2-4eb9-b037-7e867f166133.json
An exception has occurred, use %tb to see the full traceback.SystemExit: 2

使用的具体情况截图如下图图1所示。其中有个明显的问题,第一个问题是运行读代码报错如何解决,第二个问题是如果我们需要传入参数,怎么办?

图1:在jupyter notebook运行同样代码出错的截图。有两个问题,一个是代码出错,一个是命令行的参数如何传递进去?

三、使用jupyter notebook报错及传参的解决办法

解决方法很简单,通过在parser.parse_args()传入args一个参数列表就可以了。以命令行的参数为例,也就是将parser.parse_args()变为 parser.parse_args(args=['--device', '0', '--no_cuda'])就不会报错,且参数传入了。

也就是,在jupyter notebook中具体代码改为下面的就可以正常传入参数运行了:

import argparseparser = argparse.ArgumentParser()
parser.add_argument('--device', default='0,1', type=str, help='设置使用哪些显卡')
parser.add_argument('--no_cuda', action='store_true', help='不适用GPU进行训练')
args = parser.parse_args(args=['--device', '0',  '--no_cuda'])
print(args)

正确运行截图:

图2:正确运行截图。传入了参数,且不会报错。

四、出错的原因及原理

我们做一件事,不仅要知其然,而且要知其所以然。我们再回到图1的报错,提示的错误是:

usage: ipykernel_launcher.py [-h] [--device DEVICE] [--no_cuda]
ipykernel_launcher.py: error: unrecognized arguments: -f /dfsdata2/yucc1_data/.husky_cache/app_yucc1_1589251364792/jupyterlab_data_dir/runtime/kernel-3e12adb6-7cd2-4eb9-b037-7e867f166133.json
An exception has occurred, use %tb to see the full traceback.

这个错误是未识别的参数: -f 和 /dfstata2/yucc1_data这两个参数。

我们来看看,在命令运行与在jupyter notebook中运行的区别。可以通过链接https://github.com/python/cpython/blob/3.8/Lib/argparse.py看argparse模块的源码,也可以通过在jupyter中输入两个问号,查看对应的源码。图3是在jupyter中输入两个问号,查看对应函数的源码。

图3:我们调用parse_args函数的源码,parse_args又调用了parse_known_args函数,这里也有parse_known_args

通过图3,我们可以看到我们调用parse_args解析参数的时候,图中1处是调用另一个函数parse_known_args,这个函数图中2处的处理,这里的处理是优先判断args参数是否有值,如果args有值,会将args变为一个list,处理后的args也是一个list。

在jupyter和命令行中,这二者都不传入args参数的情况下,args就是None,也就是会得到 _sys.argv[1:],这个_sys是就是sys模块,_sys.argv[1:]对于命令行来说,得到的是所有的命令行参数,其中sys.argv[0]是文件名。而对于jupyter执行的时候,默认的sys.argv[1:]就不是,而是有默认的list。

可以运行以下代码查看:

import sys as _sys
print(_sys.argv[1:])

得到的结果如下图:

图4:jupyter的sys.argv有默认值两个,而在命令行中没有,这就是出错的原因。可以看到图1中出错的参数正是这两个参数,他们不识别。

可以看到在jupyter中,sys.argv[1:]是有两个默认值,这两个默认值正是出错的原因。在命令行中执行上面的代码结果是空。怎么去修正这个问题呢?很简单,就是图3的第2处看到,系统是优先传入的args参数的,所以我们这里将需要解析的参数通过args参数传入,就能正常识别了。

五、总结

在jupyter notebook中,使用argparse模块调用parse_args函数及parse_know_args函数出错的原因是,因为在命令行中传入的参数_sys.args[1:]默认是对应的参数是空,而在jupyter中有两个默认的参数。

修复的方法也很简单,只要将将parser.parse_args()变为 parser.parse_args(args=['--device', '0', '--no_cuda'])类似的方式,将参数以list的方式传入args参数即可,同样的操作也适合parser.parse_known_args()函数。

python中两个文件如何互相传参_argparse模块如何在jupyter notebook中用于传参?相关推荐

  1. 如何在Jupyter Notebook中使用在anaconda中创建的虚拟环境

    如何在Jupyter Notebook中使用在anaconda中创建的虚拟环境 1.创建虚拟环境并激活 conda create -n 虚拟环境名 python = 3.8 conda activat ...

  2. 如何在Jupyter notebook中运行python的.py文件,以及ipynb文件与py文件的相互转化

    文章目录: 1 Jupyter notebook中%开头的一些方法使用 1.1 运行python的py文件 1.2 加载本地文件 2 ipynb文件与py文件的相互转化 2.1 jupyter not ...

  3. r语言msar如何用_如何在jupyter notebook中使用R语言

    前人之述备矣,然则操作系统不同,软件版本相异,软件安装途径有别,只为于jupyter中使用R,所遇之难 ,得无异乎? 问题陈述 操作系统:win10 64 软件叙述:安装了anaconda, R(不是 ...

  4. 创建新环境后,如何在Jupyter Notebook中使用新环境?

    目录 第一步:打开cmd,切换你要使用的那个环境,使用命令 activate 环境名 如图,说明你已经切换到你想要的环境下了. 第二步:在cmd上,输入jupyter notebook,等待片刻,就会 ...

  5. jupyter notebook怎么写python代码_如何在Jupyter Notebook中使用Python虚拟环境?

    如何在使用Jupyter Notebook时,解决Python虚拟环境间的切换问题?本文一步步帮你拆解.希望你能够避免踩坑的痛苦,把更多的时间花在愉快的编程上. 痛点 Python目前有两个主版本并存 ...

  6. jupyter notebook和python有什么区别_如何在Jupyter Notebook中使用Python虚拟环境?

    如何在使用Jupyter Notebook时,解决Python虚拟环境间的切换问题?本文一步步帮你拆解.希望你能够避免踩坑的痛苦,把更多的时间花在愉快的编程上. 痛点 Python目前有两个主版本并存 ...

  7. 如何在jupyter notebook中运行markdown文件(脚本、代码)

    需要装一个notedown插件,不能直接pip install notedown安装,需要: pip install notedown --index https://mirrors.ustc.edu ...

  8. 如何在Jupyter Notebook中编写R程序

    网上有不少方法,尝试了一番,在RStudio中安装'IRkernel/IRkernel'时,报错如下: Please download and install Rtools 4.0 from http ...

  9. 如何在jupyter notebook 中修改主题、字体、字号等

    Jupyter Notebook配置命令: conda install nb_conda pip install jupyter_contrib_nbextensions pip install ju ...

最新文章

  1. linux mv 环境变量,linux环境变量,cp,mv命令,more,less,cat,tail,head,的使用...
  2. 为什么当项目启动后执行两次过滤器 再进行访问资源时执行一次过滤器
  3. js小记 function 的 length 属性
  4. mysql查询索引like_通过索引查询慢速搜索LIKE%MYSQL
  5. CentOS 初体验六:登录工具PuTTY使用
  6. 查找问题的利器 - Git Bisect
  7. 团队-爬取豆瓣电影TOP250-简单团队一阶段互评
  8. idea yml变成文件了_初识SpringBoot之配置文件(二)——配置文件值注入
  9. (转)一个由自由职业者建立的量化对冲基金
  10. rtmp/rtsp直播播放器选择
  11. 如何快速解决office2016每次打开都需要配置修复的问题,其他回答都是屁
  12. 【PI调节】对PI调节的一些认识
  13. 论文笔记:Bridging Textual and Tabular Data for Cross-Domain Text-to-SQL Semantic Parsing
  14. vue前端导出(XLSX)
  15. Maven Helper 安装使用
  16. Python全栈:Django模板
  17. android usb触摸屏idc实现触摸唤醒
  18. ncl批量处理多个nc文件_利用MATLAB读取NC文件并绘图
  19. ChaosBlade
  20. 【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.13 抗锯齿

热门文章

  1. linux nginx反向代理配置
  2. PowerShell因为在此系统中禁止执行脚本解决方法
  3. java servlet spring_带着新人简单看看servlet到springmvc
  4. python中oserror捕获_Python assert异常处理(一看即懂)
  5. 马化腾去年年薪同比下降 25%,腾讯的下一步怎么走?
  6. Linux 受到开发者偏爱的 9 个理由
  7. 拼多多否认对极兔快递“政策倾斜”;86版西游记“红孩儿”成中科院博士;AirTag遭破解 | 极客头条...
  8. 用 65 行代码实现 JavaScript 动画序列播放
  9. 2021年软件开发的五大趋势,低代码/无代码得到了验证!
  10. 从 C# 1.0 到 C# 9.0,历代 C# 语言特性一览