어쨌든 옵션 매개 변수를 옵션으로 처리하도록 Python의 getOpt를 설득 할 수 있습니까?
-
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