2016-11-11 2 views
1

일부 인수와 일부 stdin 데이터를 사용하는 스크립트가 있습니다. 내가 사용하는 인자를 확인을 위해Python argparse에서 필요에 따라 stdin을 설정할 수 있습니까?

argparse.ArgumentParser

는 어떤 표준 입력 데이터가 부여되어 있는지 확인 할 수 있습니까? 뭐 그런 :

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin, required=True) 

그러나이 예는이 오류를 제공합니다

TypeError: 'required' is an invalid argument for positionals

답변

1

번호는 그것은 당신이 명령 줄, 또는 표준 입력에 대하여 설명, 전달할 어떤 파일에서 읽을 wont't. 하나의 바이트/문자를 소비하지 않고 열린 파일 핸들을 얻을 수 있습니다.

예를 들어 data = args.infile.read() (예 : args이 파싱의 결과라고 가정)과 같이 데이터를 직접 읽으십시오.

가 비어있는 경우 그런 다음 간단한 if not data:로, 테스트 할 수 있습니다 ...

그러나 특정 형식의 데이터를 기대한다면 일반적으로, 최고의 단순히 구문 분석을 시도하고 오류가 발생하는 것입니다 네가 실패하면. 빈 데이터가 유효하지 않거나 (예를 들어 json) 유효한 데이터이지만 유효한 입력이어야합니다.

(오류의 등은 required는 일부 옵션을 --options-o 옵션, 명령 행에 주어진 여부를해야하는지 여부. 당신이 nargs 자신의 번호를 변경하지 않는 한 Positionals 항상 필요 알려줍니다). 워드 프로세서 The add_argument() method

required - Whether or not the command-line option may be omitted (optionals only).

required 키워드의

0

에만 위치하지 인수 (예를 들어, -f 또는 --foo) 옵션이 사용된다. 그냥 꺼내 줘. infile 문자열 또는 sys.stdin 파일 객체의 어느 쪽 해석

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), 
    default=sys.stdin) 

. 파일에 내용이 있는지 확인하려면 해당 파일을 읽어야합니다. 독서는 위험 할 수 있습니다 ... 당신은 영원히 차단할 수 있습니다. 하지만 이는 사용자가 지침을 따르지 않았 음을 의미합니다.

1

오류는 단지 required=True 매개 변수 때문입니다. 메시지는 무엇이 잘못되었는지를 알려줍니다. 그것은해야한다 : 당신이 위치 인수를 '--infile'만든 반대로 '호출'이 infile,에 의해

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin) 

. argparse 자체가 필요한지 여부를 결정합니다. nargs='?'으로 입력해야합니다. 그것은 정의 적으로 선택 사항입니다 (그러나 optionals 아님).

FileType 유형을 사용하면 명령 줄에서 파일 (또는 '-')의 이름을 지정할 수 있습니다. 그것을 열고 (stdin은 이미 열려 있습니다) args.infile 속성에 지정합니다. 더 이상 아무것도하지 않습니다.

구문 분석 후 args.infile을 사용하면이 열린 파일에 액세스 할 수 있습니다.이 파일은 필요에 따라 읽을 수 있으며 선택적으로 표준 입력이 아닌 경우 닫을 수도 있습니다.

이렇게하면 사용자가 코드에서 사용하기 위해 어떤 파일을 열어야하는지 지정할 수있는 편리한 방법입니다. 그것은 하나의 파일을 읽고, 뭔가하고, 다른 사람에게 글을 쓰는 간단한 스크립트를위한 것입니다.

그러나보고있는 사람이 모두 stdin 인 경우이 유형을 사용할 필요가 없습니다. sys.stdin은 항상 읽을 수 있습니다. 그리고 파서가 stdin으로 읽힐 수있는 방법이 없습니다. 명령 줄에서 오는 sys.argv을 구문 분석합니다.

파서가 파일에서 명령 줄 문자열을 읽도록 지시하는 @ 접두어 파일 기능이 있습니다. 파일을 구문 분석하고 값을 sys.argv으로 연결합니다. argparse 문서를 참조하십시오.