2013-06-13 290 views
1
變量定義

我試圖構建一個(一種模板/包裝)的劇本,這就是所謂的一些不確定的選項命令行參數在Python

> the_script.py --foo=23 --bar=42 --narf=fjoord 

,然後創建了一個名爲foo=23變量,bar=42 ,裏面有narf='fjoord'

這樣做的方法是什麼?我嘗試了getopt,但它需要第二個參數,所以我必須定義要獲取的選項,當然,我希望能夠通過命令行定義我的變量名稱。我也嘗試OptionParser,不知道如何處理未定義的選項。

那麼手動解析sys.argv的方式,還是有可能是一個模塊,它完全相同的事情?

+0

python-docopt是一個命令行參數解析模塊。一探究竟! https://github.com/docopt/docopt – scarecrow

+0

@anandaseelan - 然後所有的命令行參數需要被預先知道... – mgilson

+0

只是好奇 - 一旦你想要做什麼命令行選項擁有他們?語法總是'--foo = 23',或者它可能是'--foo 23'? – mgilson

回答

2

這是一個相對簡單的任務,ast.literal_eval和字符串拆分 - 但只有當你有一個非常好定義的語法。 (例如,只允許--foo=bar--foo bar中的1個)。

import argparse 
import ast 

parser = argparse.ArgumentParser() #allow the creation of known arguments ... 

namespace,unparsed = parser.parse_known_args() 

def parse_arg(arg): 
    k,v = arg.split('=',1) 
    try: 
     v = ast.literal_eval(v) #evaluate the string as if it was a python literal 
    except ValueError:   #if we fail, then we keep it as a string 
     pass 

    return k.lstrip('-'),v 

d = dict(parse_arg(arg) for arg in unparsed) 
print(d) 

我把鍵值對放在字典中。如果你真的想把它們當作全局變量,你可以做globals().update(d) - 但是我會認真的反對這個建議。

+0

'globals()。update(d )'是讓php陷入了許多麻煩的事情的類型 –

+0

@gnibbler - 正如我所說的,我嚴肅地建議不要這樣做。弄清楚在這種情況下定義了哪些變量的唯一方法是檢查'globals()'字典......不妨單獨保存一個字典並使用它。 – mgilson

+0

我會更關心陰影建築物的可能性。 –

3

使用此。也許你需要一些字符串'括號中的一些...

>>python yourfunc.py foo=4 abc=5 

import sys 
list=sys.argv[1:] 
for i in list: 
    exec(i)