2017-09-11 1 views
0

나는 현재 확장하고있는 간단한 명령 줄 응용 프로그램을 가지고 있습니다. 현재 몇 가지 명령 줄 인수를 지원합니다.파이썬에서 getopt 플래그를 단락/단락

try: 
    opts, args = getopt.getopt(sys.argv[1:], 'b:h', 
           ['battle=', 'help']) 
except getopt.GetoptError: 
    usage() 
    raise 

# Parse opts/args. 
for opt, arg in opts: 
    if opt in ('-h', '--help'): 
     usage() 
    elif opt in ('-b', '--battle'): 
     battle = True 

많은 추가 명령 줄 인수를 추가해야합니다. 구현 방법은 사용자가 설정할 수있는 모든 플래그에 대해 "설정"플래그를 추적해야합니다.

같은 사용자가 모두 -x, -y-z 플래그를 실행 한 경우, 남아있는 모든 구문 분석 작업을 건너 파서에게, 같은 난에 "단락"내 파서를 원하는 경우가있다, 특정 기능을 실행하십시오. 그러나 이는 각 옵션에 대해 is x,y,z set을 점검합니다.

  1. 특정 구문 분석 작업을 "단락"시키도록 구문 분석을 단순화하는 "파이썬 (pythonic)"방법이 있습니까?
  2. opt와 arg를 정렬하여 특정 순서로 플래그/opts를 구문 분석 할 수 있습니까?

답변

1

getopt을 사용하고 있습니까? 논란의 여지는 있지만 더 '파이썬적인'접근 방식은 더 간단하고 높은 수준의 모듈 인 argparse을 사용하는 것입니다. 이 경우 당신이 아니라 당신의 argparser 정의 할 수 있습니다 : 두 번째 질문에 대한

parser = argparse.ArgumentParser() 
parser.add_argument("-x", ...) 
parser.add_argument("-y", ...) 
parser.add_argument("-z", ...) 

args = parser.parse_args() 
if args.x and args.y and args.z: 
    short_circuit() 

을, 나는 argparse를 사용하여 각이 args 객체에서 이름 arg를 호출하기 때문에, 순서를 구문 분석에 대해 걱정할 필요가 제거됩니다 생각합니다.

+0

예, 'getopt'는 현재로서는 어려운 요구 사항입니다. – DevNull

+0

좋은 답변입니다. 내 솔루션의 경우 지저분한 검사. 다음 프로젝트에서는 argparse를 사용할 것이다. 감사. – DevNull

+0

네,'getopt' 만 사용 가능하기 때문에'argparse'만큼 깨끗하지는 않습니다. 보이는 각 플래그를 사전에 저장하고 루프의 끝에서 검사를 할 수 있습니다 : if all ([arg '['x ','y ','z ']의 arg에 대해 seen_args에있는 arg) : short_circuit() ' – thaavik