在ipython notebook中使用argparse方式
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.jsonAn 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,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方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。