あなたの投稿で示したように、サブクラス化はおそらくこれを行う方法です - への引数が argparse によって認識されていないAction
場合、それはかなりトリッキーになります。otherscript
でこれを回避できるかもparse_known_args
しれませんが、できないかもしれません。正直なところ、最も簡単な方法は自分自身を前処理することだと思いsys.argv
ます。
import shlex
s = shlex.split("./script --arg1 --cmdname otherscript --a1 --a2 --cmdname-- --arg3")
def preprocess(lst):
"""
process an iterable into 2 lists.
The second list contains the portion bracketed by '--cmdname' and '--cmdname--'
whereas the first portion contains the rest of it.
"""
argv1,argv2 = [],[]
current = argv1
for i in lst:
if i == '--cmdname':
current = argv2
elif i == '--cmdname--':
current = argv1
else:
current.append(i)
return argv1,argv2
l1,l2 = preprocess(s)
print l1
print l2
そして、メソッドpreprocess
を持つスライス可能なオブジェクトに対して機能する代替実装は、問題なく機能します。.index
sys.argv
def preprocess(lst):
"""
process an iterable into 2 lists.
The second list contains the portion bracketed by '--cmdname' and '--cmdname--'
whereas the first portion contains the rest of it.
"""
try:
i1 = lst.index('--cmdname')
i2 = lst.index('--cmdname--')
argv1 = lst[i1+1:i2]
argv2 = lst[:i1]+lst[i2+1:]
except ValueError:
argv1 = lst
argv2 = []
return argv1,argv2
別のオプション (@unutbu による優れたコメントで指摘されています) は、コマンドライン構文をもう少し標準的なものに変更して、問題を大幅に簡素化することです。
./script --arg1 --cmd "otherscript --a1 --a2" --arg3
cmd
次に、通常どおりに解析できargparse
ます (この引数を指定type=shlex.split
して、文字列から引数のリストに変換します)。