正如你在你的文章中指出的那樣,子類Action
可能是這樣做的 - 儘管如果參數otherscript
未被argparse所知,那將會非常棘手。你可以用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
另一種選擇(在一個優越的評論指出, by @unutbu)是將命令行語法改爲更簡單一點的標準,這大大簡化了問題:
./script --arg1 --cmd "otherscript --a1 --a2" --arg3
然後,您可以像平常使用那樣解析cmd
(指定type=shlex.split
將此參數從字符串轉換爲參數列表)。
這會替代語法足夠? './script --arg1 --cmdname「otherscript --a1 --a2」--arg3' – unutbu
@unutbu - 這是一個非常好的建議。與'shlex.split'配對,我想你會做生意。 – mgilson
@unutbu和@mgilson:好點!不知道'shlex.split()'。我提出的語法在shell引用和轉義方面更具吸引力:如果您不必擔心引用,那麼通過子命令傳遞它們的參數會更容易。 – cfi