문제

나는 내 프로젝트를 위한 쉘을 작성하고 있는데, 이 쉘은 설계상 다음과 같은 명령을 구문 분석합니다.

COMMAND_NAME ARG1="긴 값" ARG2=123 ARG3=me@me.com

내 문제는 Python의 명령줄 구문 분석 라이브러리(getopt 및 optparse)가 인수 앞에 '-' 또는 '--'를 사용하도록 강제한다는 것입니다.이 동작은 내 요구 사항과 일치하지 않습니다.

이 문제를 어떻게 해결할 수 있습니까?이에 대한 기존 라이브러리가 있습니까?

도움이 되었습니까?

해결책

인용된 값을 처리할 수 있는 shlex.split()을 사용하여 이를 분할할 수 있으며 매우 간단한 정규식을 사용하여 이를 매우 쉽게 구문 분석할 수 있습니다.또는 분할과 구문 분석에 정규식을 사용할 수도 있습니다.아니면 간단히 분할()을 사용하세요.

args = {}
for arg in shlex.split(cmdln_args):
    key, value = arg.split('=', 1)
    args[key] = value

다른 팁

  1. 팔로우하려고 "명령 줄 인터페이스의 표준"

  2. 논증 (토마스가 제안한대로)을 OptionParser 형식으로 변환하십시오.

    parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])
    

명령 줄 인수가 sys.argv 또는 유사한 목록에 있지 않지만 문자열에있는 경우 (Ironfroggy가 제안한대로) 사용 shlex.split().

parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])

Ironforggy의 Shlex 답변에 대한 작은 피스닉 변형 :

args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )

죄송합니다 ...- 수정.

감사합니다, JF Sebastian (단일 인수 생성기 표현식을 기억해야 함).

OptMatch는 어떻습니까 (http://www.coderazzi.net/python/optmatch/index.htm)? 표준은 아니지만 옵션 구문 분석에 대해 다른 접근 방식을 취하며 모든 접두사를 지원합니다.

옵션 matcher.setmode (옵션prefix = '-')

OptParse 또는 GetOpt에서 상당히 집중적 인 수술을받지 않으면 서 형식을 구문 분석 할 수 있다고 생각하지 않습니다. 그러나 자신의 형식을 쉽게 구문 분석하거나 OptParse가 처리 할 수있는 것으로 번역 할 수 있습니다.

parser = optparse.OptionParser()
parser.add_option("--ARG1", dest="arg1", help="....")
parser.add_option(...)
...
newargs = sys.argv[:1]
for idx, arg in enumerate(sys.argv[1:])
    parts = arg.split('=', 1)
    if len(parts) < 2:
        # End of options, don't translate the rest. 
        newargs.extend(sys.argv[idx+1:])
        break
    argname, argvalue = parts
    newargs.extend(["--%s" % argname, argvalue])

parser.parse_args(newargs)

파티에 조금 늦었지만 ...하지만 PEP 389 이것과 훨씬 더 많은 것을 허용합니다.

Python 버전이 Code.google.com/p/argparse가 필요한 경우 약간 멋진 라이브러리가 있습니다.

즐기다.

명령 줄 인수를 더 쉽게 처리하기 위해 쓴 작은 파이썬 모듈에 관심이있을 수 있습니다 (오픈 소스 및 무료 사용) - http://freshmeat.net/projects/commando

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top