2017-06-24 9 views
2

これは簡単な作業のようですが、スクリプトに引数を渡し(処理しないように)プログラムに指示するために、コマンドに " - "を追加するという要件があります。たとえば:Brenda-Webインターフェイスを介して引数をPythonブレンダースクリプトに渡すと、引数を解析する方法は?

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

個別にそれらすべてを壊す:

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

私はこれを使用してスクリプトの引数を分離する方法を発見しました。私は何が起こる必要があると思いません。私もargparseを試しましたが、 " - "はそれを壊していると思います。誰もがこのようなものを解析する複雑な方法を知っていますか?

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

しかし、私は「ブレンダー:エラー:認識できない引数:」で立ち往生しています:私はこのような何かを行うことができるように、一緒にargの+値を維持したいと思います

EDIT --- -------------------------- EDIT ---------------------- [ '-items'、 '1'、 '型'、 'AO' は、 '-samples'、 '100'、 '-size'、「1024: - このような構造を作成

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) 

']

どうすればいいですか?私はこれが間違った方向に向かっていると思います。私は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

[この回答](https://blender.stackexchange.com/a/8405/935)は、必要なものをカバーする必要があります。これには、blenderに含まれるテンプレートへのリンクがあります。 – sambler

+0

リンクをありがとう。私はそれがもともと始まった場所だと思うが、それは "キー:値"のペアとして引数にアクセスするためのソリューションを提供していない。スペースで分割するだけで、すべてのインデックスを作成できます。私は、関係を損なわないものを使用したいと思います。 – Mattehicks

+0

'argv = argv [argv.index(" - ")+ 1:]'行は 'sys.argv'から必要なargsをコピーしています。次に、キーと値のペアを取得するために、['parser.parse_args(argv)'](https://docs.python.org/3/library/argparse.html#parsing-arguments)でそれを使うことができます。 – sambler

答えて

0

あなたはイテレータを使用して、独自のパーサを作ることができます。このコードは(--前と後)2枚のdictsにあなたの引数を区切るます:

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のi)' – Mattehicks

関連する問題