어쨌든 옵션 매개 변수를 옵션으로 처리하도록 Python의 getOpt를 설득 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1532737

  •  20-09-2019
  •  | 
  •  

문제

Python의 문서에 따르면 getopt (내 생각은) 옵션 필드는 getopt() 기능. 그러나 내 코드에 선택적인 매개 변수를 활성화 할 수없는 것 같습니다.

#!/usr/bin/python
import sys,getopt

if __name__ == "__main__":
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="])
    except getopt.GetoptError, err:
        print str(err)
        sys.exit(1)

    for o,a in opts:
        if o in ("-v", "--verbose"):
            if a:
                verbose=int(a)
            else:
                verbose=1
            print "verbosity is %d" % (verbose)

결과 :

$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1
도움이 되었습니까?

해결책

getopt 선택적 매개 변수를 지원하지 않습니다. 긴 옵션의 경우 다음을 수행 할 수 있습니다.

$ ./testopt.py --verbose=

이로 인해 빈 스트링 값이 발생합니다.

당신은 찾을 수 있습니다 argparse 모듈이 더 유연합니다.

다른 팁

불행히도, 방법은 없습니다. 로부터 optparse 문서:

일반적으로 주어진 옵션은 인수를 받거나 그렇지 않습니다. 많은 사람들이 "옵션 옵션 인수"기능을 원합니다. 즉, 일부 옵션은 그들이 볼 때 인수를 받고 그렇지 않으면 그렇지 않을 것입니다. "-a"가 선택적 인수를 취하고 "-b"가 전적으로 또 다른 옵션이라면 "-ab"를 어떻게 해석합니까? 이러한 모호성으로 인해 OptParse는이 기능을 지원하지 않습니다.

편집하다: 죄송합니다. 즉, GetOpt 모듈이 아닌 OptParse 모듈을위한 것입니다. 그러나 어떤 모듈도 "옵션 옵션 인수"를 갖는 이유는 두 가지 모두에 대해 동일합니다.

다음과 같은 getOpt로 선택적 매개 변수를 수행 할 수 있습니다.

import getopt
import sys

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
argDict = dict(longopts)

if argDict.has_key('--env') and argDict['--env'] == 'prod':
    print "production"
else:
    print "sandbox"

용법:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

버전 2.3 이상을 사용하는 경우 시도해 볼 수 있습니다. optparse 대신 모듈은 "더 편리하고 유연하며 강력한 ..."뿐만 아니라 새롭기 때문에 모듈. 아아, Pynt가 대답했듯이, 당신이 원하는 것을 정확하게 얻을 수없는 것 같습니다.

Python의 getOpt는 매개 변수를 지정할 때 '='를 요구하여 GNU getOpt와 같은 옵션 적 ARGS를 실제로 지원해야합니다. 이제 -option을 -option =로 암시 적으로 변경 함으로써이 제약 조건을 사용하여 매우 쉽게 시뮬레이션 할 수 있습니다.

즉 -option이 인수가 필요하다는 것을 지정한 다음 -option을 다음과 같이 -option =로 조정할 수 있습니다.

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top