正如您在帖子中指出的那样,子类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
另一种选择(在@unutbu 的出色评论中指出)是将命令行语法更改为更标准的东西,从而大大简化了问题:
./script --arg1 --cmd "otherscript --a1 --a2" --arg3
cmd
然后您可以像通常使用的那样进行解析argparse
(指定type=shlex.split
此参数以将其从字符串转换为参数列表)。