이것은 유용하지 않을 수도 있지만, sys.argv
을 조각으로 나눌 수 있다면이 문제는 가장 쉬운 것 같습니다. 본질적으로 어느 부분이 "위치 적"인수가되어야하는지 파악할 수 있어야합니다 당신이 말했듯이, 그들은 어디에서나 발생할 수 있습니다.) 그리고 어떤 조각들이 어떤 종류의 논쟁으로 여겨지기 때문에 실제로 위치가 정해지지 않았습니다. 아래의 예제에서는 예제를 사용하도록 설정했지만 파일이나 특정 종류의 파일에 대해서도 마찬가지로 sys.argv
을 쉽게 분할 할 수 있습니다. condition
기능은 귀하가 작성해야합니다. 나머지는 (희망을 갖고) 자명하다.
import argparse
import sys
import copy
import os
def split_list(lst,condition):
current=[]
out=[current]
for arg in lst:
current.append(arg)
if(condition(arg)):
current=[]
out.append(current)
return out
parser=argparse.ArgumentParser()
parser.add_argument('-m',action='store')
parser.add_argument('-r',default='0',action='store')
#pieces=split_list(sys.argv[1:],os.path.isfile)
pieces=split_list(sys.argv[1:],lambda x: x in ('foo','bar','baz','quux'))
options={} #use collections.OrderedDict if order matters -- or some more suitable data structure.
default=argparse.Namespace()
for args in pieces:
if(not args):
continue
ns=copy.deepcopy(default)
default=parser.parse_args(args[:-1],namespace=ns)
options[args[-1]]=default
print (options)
"인수 상태"가 일정합니까? 예 : '('foo', 'bar', 'baz', 'quux'...) 만 사용한다면 앞을 알 수 있습니까? 아니면 사용자가 원하는대로 무엇이든 넣을 수 있습니까? – mgilson
@mgnilson - 원하는 곳이면 어디서든 사용할 수 있습니다. 내가 바라는 것은 파일 이름과 처리 옵션의 목록이다. 'argparse'가 위치 인수를 다루는 것에 기반하여, 저는 모델을 깨뜨리는 커스텀 액션 없이는 이것을 수행 할 수 없다고 생각하고 있습니다. 이것은 현재 내가 놀고있는 것입니다. –
커스텀 액션에 대해서도 생각하고 있었지만, argparse는 모든 위치 인수가 함께 주어진 것으로 가정하기 때문에 까다 롭습니다. 유일한 해결책은'nargs = '*''를 모든 곳에서 사용하고 모든 작업 내에서 올바른 번호를 가지고 있는지 확인하는 것입니다. (그것은 기껏해야 깨지기 쉬운 것처럼 보인다). '-m 1 -f foo -r 2 -f bar -r 7 -f baz -m 6 -f quux' – mgilson