2017-06-24 20 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