2017-10-08 10 views
0

나는 sys.argv을 사용하여 필요한 것을 얻을 수 있지만,이 기능을 허용하는 것과 동등한 argparse를 찾을 수 없습니다.
현재 sys.argv와 내가 편리하게 프로그램이 같은 방식으로 명령을 실행할 수 있도록 할 수 있어요 : 변경되지 않습니다첫 번째 위치 인수가 대시가 될뿐만 아니라 사용자가 입력 한 여러 값 중 하나를 허용하는 argparse의 방법이 있습니까?

python program.py ls 
python program.py del input 
python program.py arg 
python program.py input input2 

ls --keyword 인수 - 그것은 사전에 도달하고 그 키를 나열합니다.
del input - del은 사용자의 input이 사전에서 삭제되어야하는 키임을 지정하는 키워드입니다.
arg - dict 내의 여러 키 중 하나 일 수 있습니다.
input input2 - 완전히 새로운 키와 사전에 추가 된 값입니다.

dict 관련 정보는 인수의 기능을 설명하기위한 것입니다.

대시가없는 것 외에도 여러 인수가 첫 번째 위치에있을 수 있습니다. 게다가, 첫 번째 위치 인수 (input, del) 중 두 개는 완전히 새로운 지정되지 않은 두 번째 위치 인수를 사용자에게 부여 할 수 있습니다.

+0

[* partial parsing *] (https://docs.python.org/3/library/argparse.html#partial-parsing)과 같은 소리가납니다. –

+0

불행히도, 서브 파서가 부분 파싱을 방해하는 것처럼 보였으므로 대답을 삭제했습니다. 아마 대신 사용자 정의 작업이 필요합니다. –

+0

@MartijnPieters right. ''ls'는 서브 파서가 의도 한대로 작동하지만'del'에 두번째 입력을 추가하는 데 문제가있었습니다. 다른 제안이 있으십니까? – Homer

답변

1

언뜻보기에 'ls', 'del'등의 명령을 사용하여 서브 파서의 경우처럼 보입니다. 의 key 값이 프로그래머 정의 사전에서 오는 여부를

python program.py <key> 
program.py <key value> 

그것은 분명하지 않다 : 난 그냥 subparsers이 클래스

How to design object oriented subparsers for argparse?

에 정의되어 있습니다 예를 스케치 그러나 이러한 입력은 복잡 또는 사용자의 임의의 값입니다.

예제에서 볼 수 있듯이 프로그래머가 정의한 사전의 키를 서브 파서로 추가 할 수 있습니다.

그러나 임의의 '키 값'항목에는 다른 정의가 필요합니다. 많은 사람들이 key:value 또는 key=value 쌍을 입력하라는 질문을 많이 받았습니다. argparse이 문제를 정상적으로 처리하지 못합니다. 프로그래머가 입력을 완전히 제어하려는 경우에 더 좋습니다.

아마도 간단한 argparse 접근 방식은

parser.add_argument('cmd') # simple required 1 term positional 
parser.add_argument('value', nargs='?') # optional term 

그리고 당신은 args.cmdargs.value 문자열의 자신의 시험을한다. 이는 sys.argv[1]sys.argv[2:]을 평가하는 데별로 도움이되지 않습니다.

은 값이 정의 된 문자열 세트로 제한되는 서브 파서 cmd과 매우 유사하게 동작합니다.

optparse은 플래그가 지정된 (-) 인수를 처리하고 모든 위치를 다시 목록으로 전달합니다. argparsenargs 매개 변수와 일부 positionals을 정의 할 수있는 기능을 제공하여이를 향상시키고 자 노력합니다.그러나 플래그가 지정된 많은 인수를 처리하는 것이 더 좋습니다. 위치 정보에 대한 콘텐츠 테스트는 제한적입니다.

요약하면 argparse으로 이식하면 아무 것도 사지 못할 수도 있습니다. 당신은 표준이 아닌 표준에 맞서 노력하고 있습니다.


스크립트 argparse을 비교하고 여기이 목록의 첫 번째 제외한 모든 문자열을 걸었습니다

import sys 

key = None 
if sys.argv[1:]: 
    key = sys.argv[1] 
value = sys.argv[2:] 

print(key, value) 

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('key') 
parser.add_argument('value', nargs='*') 
args = parser.parse_args() 
print(args) 

를 분석 sys.argv에. '?'를 사용하십시오. 선택적으로 하나의 문자열을 허용합니다.

샘플 실행 :

1111:~/mypy$ python stack46631607.py 
(None, []) 
usage: stack46631607.py [-h] key [value [value ...]] 
stack46631607.py: error: too few arguments 

1111:~/mypy$ python stack46631607.py ls 
('ls', []) 
Namespace(key='ls', value=[]) 

1112:~/mypy$ python stack46631607.py del input 
('del', ['input']) 
Namespace(key='del', value=['input']) 

1112:~/mypy$ python stack46631607.py key 1 2 3 
('key', ['1', '2', '3']) 
Namespace(key='key', value=['1', '2', '3']) 

1112:~/mypy$ python stack46631607.py -h 
('-h', []) 

usage: stack46631607.py [-h] key [value [value ...]] 

positional arguments: 
    key 
    value 

optional arguments: 
    -h, --help show this help message and exit 

argparse는 오류 검사 (즉, 누락 된 첫 번째 문자열)을 추가하고, 도움이됩니다.

args.key 값을 어떻게 처리할지 결정하는 것은 귀하에게 달려 있으며, 이는 value 목록을 필요로하는지 여부를 결정합니다. 내가 말한대로 최선을 다해 ls의 처리는 'arg'와 같고 'del'은 '입력'과 같습니다.

+0

그래서 argparse는 갈 길이 멀지 않습니다. 무엇입니까? – Homer

+0

'sys.argv '로 이미하고있는 것에는 무슨 문제가 있습니까? – hpaulj

+0

저는 아무 것도 생각하지 않았습니다. 코드를 검토하고 사람들이 내 자신의 주장을 제대로 처리하지 않을 것을 제안 할 때까지는 아무 것도 생각하지 않았습니다. 현재 len (sys.argv)을 측정하고 사용자가 입력 한 문자열에 따라 함수를 수행하는 if 문이 많이 있습니다. – Homer