2012-01-16 12 views
9

我想使用pythons argparse模塊來解析我的cli參數字符串。這適用於從終端傳遞的參數,但不適用於給定的字符串。如何在預定義的參數字符串中使用python的argparse?

import argparse 

parser = argparse.ArgumentParser(description='Argparse Test script') 
parser.add_argument("param", help='some parameter') 

argString = 'someTestFile' 
print(argString) 

args = parser.parse_args(argString) 

如果我運行此腳本,我得到這樣的輸出:

~/someTestFile 
usage: argparsetest.py [-h] param 
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e 

~/someTestFileo m e T e s t F i l e某種方式轉化。如前所述,如果我從終端傳遞文件名,它就可以工作。

我可以想象,這與字符串編碼有關。有人有一個想法如何解決這個問題嗎?

+0

您可能需要查看[argparse文檔](http://docs.python.org/library/argparse.html#parsing-arguments)。 – 2012-01-16 10:19:10

回答

19

啊,不,不,不。 parser.parse_args()預計與sys.argv[1:]具有相同形式的序列。如果你像一個sys.argv序列那樣處理一個字符串,你會得到['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e']。 's'成爲相關的參數,然後字符串的其餘部分是不可解析的。

相反,你可能想在parser.parse_args(['someTestFile'])

+0

謝謝!就是這樣......! – thorink 2012-01-16 10:23:35

4

傳遞就像默認sys.argv是一個列表,你的論點必須是一個名單。

args = parser.parse_args([argString]) 
16

另一種選擇是使用shlex.split。這是特別是如果你有真正的CLI參數字符串非常方便:

import shlex 
argString = '-vvvv -c "yes" --foo bar --some_flag' 
args = parser.parse_args(shlex.split(argString)) 
+1

謝謝!這非常有用。現在我可以從命令行運行以及從其他python腳本運行! – Sudhi 2016-04-21 02:47:36

+0

有人請給這個人一個餅乾 – 2017-11-04 23:03:50

0

只需split您的命令字符串:

args = parser.parse_args(argString.split()) 

一個完整的例子來展示:

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids') 
    argString = "--dummy_opt 128 128" 
    args = parser.parse_args(argString.split()) 

    print(args) 

將輸出:

Namespace(pic_resize=[128, 128])

相關問題