2012-02-25 5 views
9
from sys import argv 
script, lira_cbt, [eur_hedge] = argv 

if eur_hedge == None: 
    #Do x 
else: 
    #Do y 

저는 lira_cbt를 인자로 (x를 할 때), 또는 lira_cbt와 eur_hedge (y를 할 때) 둘 다 사용할 수 있기를 원합니다. sys.argv로이 작업을 수행 할 수 있습니까?sys.argv에서 선택적 인수를 처리 할 수 ​​있습니까?

+1

당신의 CLI가 복잡해 경우 (일부 이전 버전과 붙어있는 경우 또는'optparse'), 당신은 아마'argparse'를 사용하여 시작해야합니다. – delnan

답변

15

그냥 sys.argv

if len(sys.argv) == 2: 
    # do X 
else: 
    # do Y 
2

sys.argv의 길이를 간단히 확인할 수 있습니다.

lira_cbt = sys.argv[1] 
try: 
    eur_hedge = sys.argv[2] 
except IndexError: 
    eur_hedge = None 

if eur_hedge == None: 
    # Do X 
else: 
    # Do Y 

또한 대한 getopt에서 살펴 수 :

if len(sys.argv) < 2: 
    # Error, not enough arguments 

lira_cbt = sys.argv[1] 
if len(sys.argv) == 2: 
    # Do X 
else: 
    eur_hedge = sys.argv[2] 
    # Do Y 
+0

하지만 eur_hedge의 값을 구체적으로 가져올 방법이 없기 때문에 인수를 풀기 위해 더 많은/너무 많은 변수가 필요하지 않습니다. – Felix

+2

아니요, 당신이 함수 호출로 변환하고'main (script, lira_cbt, eur_hedge = None)'과'main (* sys.argv)'같은 것을 사용하기를 원하지 않는 한, 그렇게 할 방법이 없습니다. 나는 확실히하지 않을 것이다. –

1

또 다른 옵션은 try을 사용하여 ARGV 목록에서 값을 추출하는 것입니다의 길이를 사용 명령 줄 인수에 대한보다 유연한 파서입니다.

+2

optparse 또는 argparse는 getopt보다 훨씬 낫습니다! – carl

5

이 던져 - 멀리 스크립트보다 더의 일부가 될 경우, 그것은 훨씬 더 복잡 될 것입니다 순간 argparse http://docs.python.org/library/argparse.html

사용을 고려, 그러나 당신이 당신의 프로그램이 허용하는 옵션을 문서화 계속 도움이됩니다 "사용자가 이해하지 못할 수도있는"너무 많은 값을 압축하는 것과는 달리 유용한 오류 메시지를 제공합니다.

0

내가 다른 방법을 제안 할 수있는 경우 :

from sys import argv 
option_handle_list = ['--script', '--lira_cbt', '--eur_hedge'] 
options = {} 
for option_handle in option_handle_list: 
    options[option_handle[2:]] = argv[argv.index(option_handle) + 1] if option_handle in argv else None 
if options['eur_hedge'] == None: 
    #Do x 
else: 
    #Do y 
+0

이것이 효과가 있을지 모르지만,이 작업을 위해'argparse'와 같은 모듈을 사용하는 것이 더 쉽고 더 평범 할 것입니다. – YSelf

+0

@YSelf 더 쉽고/더 전통적인 해결책에 대해서는 논쟁하지 않습니다. 원래 질문에 대답하는 것뿐입니다. –

관련 문제