2016-06-25 2 views
0

입력 파일 옵션과 출력 파일 옵션이 있다고 가정 해 봅니다. 어떻게 둘을 결합한 옵션을 만들 수 있습니까? 예를 들어 :다른 옵션 결합을위한 argparse 단축키 옵션

$ ./my_script.py --io input_output.txt 
당신은 내가 두 옵션을 결합 -io을 할 수 있다고 말할 수

하지만 -io filename-i -o filename하지 -i filename -o filename에 대한 바로 가기입니다 :

$ ./my_script.py -i input.txt -o output.txt 

은 다음과 같이 결합 될 수있다.

.add_argument() 호출에 dest=('input', 'output')을 추가 할 수 있다고 생각했지만 dest은 문자열이어야합니다.

내가 나타나지 않았다 한쪽에 --io와 상호 배타적 인 그룹과 -i 다른 측면에 -o의 그룹 만 -i-o에 대한 도움말 텍스트를 추가하는 시도

더 이상 프로그램이 --help으로 실행할 때 :

usage: myscript.py [-h] [--io] [-i INPUT] [-o OUTPUT] 

optional arguments: 
    -h, --help show this help message and exit 
    --io  Use file as both input and output 

또한 상호 배타적 인 부분은 작동하지 않는 것 같습니다. 나는 여전히 --io과 개별 -i-o 옵션을 사용하여 스크립트를 호출 할 수 있으며 오류는 발생하지 않습니다. 그룹과

import argparse 

parser = argparse.ArgumentParser() 

parser.add_argument("-i", "--input", help="Input file") 
parser.add_argument("-o", "--output", help="Output file") 

parser.parse_args() 

코드 :

여기 내 골격 코드

import argparse 

parser = argparse.ArgumentParser() 

exclusive = parser.add_mutually_exclusive_group() 
exclusive.add_argument("--io", help="Input and Output") 

sub = exclusive.add_argument_group() 
sub.add_argument("-i", "--input", help="Input file") 
sub.add_argument("-o", "--output", help="Output file") 

args = parser.parse_args() 

if args.io: 
    in_file = out_file = args.io 
else: 
    in_file = args.input 
    out_file = args.output 

답변

1

해결 방법을 제안하는 것보다 일이 왜 효과가 없는지 설명하는 것이 더 쉽습니다.

예, dest은 문자열이어야합니다. dest 값의 목록 또는 튜플에 대한 조항이 없습니다. 하지만 귀하의 in_file = out_file = args.io 주소는 문제가 없습니다. 당신도 사용할 수 : 구문 분석 후 args 값을 마사지 아무 문제가 없습니다

args.in_file=args.out_file = args.io 

.

argument_group은 중첩을 위해 설계되지 않았으며 mutually_exclusive_group에 '모든'(또는 '및') 논리를 추가하는 방식도 아닙니다. 어쩌면 먼 미래에 논리적 조합의 전체 집합을 정의 할 수있는 방법이있을 것입니다. 그러나 지금은 아닙니다. 사실 시험을하는 것은 어렵지 않습니다. API 및 사용 형식을 정의하기가 어렵습니다.

mutually_exclusive_group은 인수 서식을 지정하고 co_ocurrance를 테스트하는 데 사용되며 argument_group은 인수 도움말 줄을 그룹화하는 데 사용됩니다. 아주 다른 두 가지 목적.

-istore_true 인 경우, -io filename-i -o filename으로 이해 될 수있다.그러나 그것도 역시 -i filename -o filename으로 번역하는 것은 현재 코드에 없으며 아마도 패치를 보증하기에 충분하지 않을 수도 있습니다. 당신이 원하는 것을 보여주는

  • 사용자 정의 사용을 쓰기 :

    당신은 아직도 내가 몇 가지를 제안 할 수 -i, -o--io (나는이 문자 플래그에 대한 --를 선호) 사용하려면

    . 분명한 사용법을 쓰는 것이 어렵다면 디자인이 너무 복잡 할 것입니다.

  • 구문 분석 후 사용자가 직접 exclusive groups 테스트를 수행하십시오. args.in_file is None은 플래그가 사용되었는지 여부를 테스트하는 좋은 방법입니다. 또 다른 가능성은 사용자가 어떤 조합을 사용하는지 상관하지 않도록 기본값을 정의하는 것입니다.

0

간단하게 - 당신이 어쨌든 모두 양식을 사용하여 배제하지 않았다 보였다 독점 그룹 코드입니다. 이것을 시도하십시오 :

import argparse 

parser = argparse.ArgumentParser() 

parser.add_argument("-i", "--input", help="Input file") 
parser.add_argument("-o", "--output", help="Output file") 
parser.add_argument("--io", help="Input and Output") 

parser.parse_args() 

if args.io: 
    assert args.input is None and args.output is None 
    args.input = args.output = args.io 
else: 
    assert args.input and args.output 
+0

너무 쉽지 않습니다. 나는 AssertionError보다 좀 더 사용자 친화적 인 것을 사용한다는 점을 제외하고는 이것과 비슷한 것을 사용하기로 결정했다. – zondo