2017-06-24 19 views
2

這似乎是一件容易的事情,但要求在命令中添加「 - 」,以告訴程序將參數傳遞給腳本(而不是處理它們)。例如:通過brenda-web界面將參數傳遞給python攪拌器腳本,我如何解析參數?

$ blender -b testscene.blend --python localrender.py -- -start 1 -type diffuse -samples 100 

我找到了一種方法,通過使用這種分離出腳本參數:其分別打破它們加起來

try: 
    args = list(reversed(sys.argv)) 
    idx = args.index("--") 
except ValueError: 
    params = [] 
else: 
    params = args[:idx][::-1] 
    print("Script params:", params) 

。這不是我認爲需要發生的事情。我也嘗試過argparse,但我認爲「 - 」正在打破它。有沒有人知道解析這些東西的複雜方法?我想保持ARG +價值在一起,這樣我可以做這樣的事情:

args = parser.parse_args() 
if args.index: 
    logging.info("index set to: " + str(args.index)) 

但我堅持「攪拌機:錯誤:無法識別的論點:」

編輯--- -------------------------- 編輯---------------------- -

I am currently using this to grab the args after "--" 
try: 
    args = list(reversed(sys.argv)) 
    idx = args.index("--") 
except ValueError: 
    params = [] 
else: 
    params = args[:idx][::-1] 
    #print("Script params:", params) 

logging.info(params) 

這產生這樣的結構: [ '-items', '1', '型', 'A0', '-samples', '100', '-size',「1024 ']

我該怎麼辦?我認爲這是錯誤的方向,因爲我想按照Option:Argument進行分組。 我想這個代碼還,但它在參數的實際字母分成部分:

try: 
    #getopt.getopt(sys.argv[1:], 'x:y:') 
    #opts,val = getopt.getopt(params,"hi:o:",["objindex="]) 
    opts, args = getopt.getopt(params, "h:o") 
except getopt.GetoptError: 
    logging.info('prototype.py --items <items>') 
    sys.exit(2) 

logging.info("params:") 
logging.info(params) 
logging.info("opts") 
logging.info(opts) 

exit() 

for opt, val in opts: 
# print("option" + opt) 
    if opt in ("--items", "-items"): 
    objindex = val 
    elif opt in ("--type", "-type"): 
    logging.info("found render type: " + val) 
+1

[This answer](https://blender.stackexchange.com/a/8405/935)應該涵蓋你想要的。請注意,它有一個鏈接到攪拌機附帶的模板。 – sambler

+0

感謝您的鏈接。我認爲這就是我最初開始的地方,但它並不提供以「key:value」作爲參數訪問參數的解決方案。它更多的是在空間分裂,並索引它。我想用一些可以保持關係完好的東西。 – Mattehicks

+0

注意'argv = argv [argv.index(「 - 」)+ 1:]'這行'從'sys.argv'複製了你想要的參數。然後你可以在['parser.parse_args(argv)'](https://docs.python.org/3/library/argparse.html#parsing-arguments)中使用它來獲得鍵值對。 – sambler

回答

0

你可以讓自己的解析器,通過使用迭代器。此代碼將單獨你的論點分爲兩個類型的字典(前後--後):

args = '-b testscene.blend --python localrender.py -- -start 1 -type diffuse -samples 100' 
iter = (i for i in args.split(' ')) 

args_dict = {'part1': {}, 'part2': {}} 
current_part = 'part1' 
for chunk in iter: 
    if chunk == '--': 
     current_part = 'part2' 
     continue 
    if chunk.startswith('-'): 
     args_dict[current_part][chunk.lstrip('-')] = next(iter) 

print(args_dict) 

輸出:

{'part1': {'b': 'testscene.blend', 'python': 'localrender.py'}, 
'part2': {'samples': '100', 'start': '1', 'type': 'diffuse'}} 

我真的不知道你想,雖然這些論點做什麼如果您需要更多幫助,請澄清您的問題。

+0

增加了一個編輯回覆你TrakJohnson: – Mattehicks

+0

@MattH你說在你的編輯中,你試圖將它們分組爲選項:參數,但是這就是我的答案:關鍵是一個選項(沒有' - '或前面的' - '),值是參數。這不是你在尋找什麼? – TrakJohnson

+0

'args = sys.argv iter =(我爲我在args)' – Mattehicks