요구 사항 검토
- 사용
argparse
(나는 이것을 무시할 것입니다)
- 하나 또는 두 개의 작업을 호출 할 수 있습니다 (적어도 하나는 필요함).
- Pythonic에 의해 시도하십시오 (차라리 "POSIX"와 같은 이름으로 부르고 싶습니다)
명령 줄에서 생활 할 때 몇 가지 암시 적 요구 사항도 있습니다.
- 이해하기 쉬운 방식으로 사용자에게 사용법 설명
- 옵션은 선택 사항입니다.
- 플래그 및 옵션 지정 허용
- 다른 매개 변수 (예 : 파일 이름 또는 이름)와 결합 할 수 있습니다.
docopt
(파일 managelog.py
)을 사용한 샘플 솔루션 :
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
그것을 실행하십시오 :
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
도움말보기 :
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
그리고 그것을 사용하십시오 :
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
짧은 대안 short.py
더 짧은 변형이있을 수 있습니다.
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
사용법은 다음과 같습니다.
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
"process"및 "upload"키에 대한 부울 값 대신 카운터가 있습니다.
우리는 다음 단어의 중복을 막을 수 없습니다.
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
결론
좋은 명령 줄 인터페이스를 디자인하는 것은 때때로 어려울 수 있습니다.
명령 줄 기반 프로그램에는 여러 측면이 있습니다.
- 명령 줄의 좋은 디자인
- 적절한 파서 선택 / 사용
argparse
많은 것을 제공하지만 가능한 시나리오를 제한하고 매우 복잡해질 수 있습니다.
와 docopt
가독성을 보존하고 유연성의 높은 수준을 제공하면서 상황이 훨씬 짧은 이동합니다. 사전에서 구문 분석 된 인수를 가져오고 수동으로 (또는라는 다른 라이브러리를 사용하여 schema
) 일부 변환 (정수로 변환 ) docopt
을 수행하는 경우 명령 줄 구문 분석에 적합 할 수 있습니다 .
-x
보편적으로 플래그이며 선택 사항입니다.-
필요한 경우 잘라냅니다 .