2013-02-13 4 views
2

다음 사용을 고려 인수에 대해 :파이썬은 argparse : 옵션 및 위치 모두 값을

usage: do.py [-h] [-s | -m] filename 

이 전체 사용하지 않습니다.

--filename FILENAME 

뿐만 아니라, filename 그래서 난 표준 입력에서 읽을 수있는 선택해야한다 :하지만 효과적으로 filename가 아닌 파일의 실제 값이 될 것입니다 싶다. UNIX에서 cat 프로그램에 대해 생각해보십시오.

당신은 단순히 말 :

cat filename 

또는

cat 

편집 : 나는 명령 줄 옵션없이 프로그램 do.py을 실행하면 지금, 내가 error: too few arguments을 얻을 것이다. 대신 유효한 filename을 제공하지 않더라도 여전히 실행하고 싶습니다. 어떻게해야합니까?

+1

약간 가벼운 사양이 멋집니다. 질문은 무엇입니까? 게시물의 본문을 편집하여 솔루션에 포함 시키십시오. 그러면 사람들이 올바른 방향으로 여러분을 안내 할 것입니다. 고맙습니다. – bernie

+0

지금 명령 행 옵션없이 프로그램 do.py를 실행하면 오류가 발생합니다. 인수가 너무 적습니다. 대신 파일 이름이 없더라도 여전히 실행하고 싶습니다. – p0lAris

+0

필수 = 위치 지정에 대해 거짓이 작동하지 않습니다. – p0lAris

답변

5

업데이트 2 : ArgParse 문서에서,

One of the more common uses of nargs='?' is to allow optional input and output files:

>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), 
...      default=sys.stdin) 
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), 
...      default=sys.stdout) 
>>> parser.parse_args(['input.txt', 'output.txt']) 
Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>, 
      outfile=<open file 'output.txt', mode 'w' at 0x...>) 
>>> parser.parse_args([]) 
Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>, 
      outfile=<open file '<stdout>', mode 'w' at 0x...>) 

원래 답 :

이 간단하다 : 단지 기본 값과 nargs='*'와 위치 인수를 추가합니다. 제로 인수가있는 경우 기본값은 그렇지 않으면 명령 행 인수가 사용됩니다 사용됩니다

>>> p = argparse.ArgumentParser() 
>>> p.add_argument('filename', nargs='*', default=['-']) 
>>> p.parse_args([]) 
Namespace(filename=['-']) 
>>> p.parse_args(['abc']) 
Namespace(filename=['abc']) 

일반적으로 - 표준 입력/표준 출력을 참조하는 데 사용됩니다.

def get_inputs(ns): 
    """Iterate over input files.""" 
    for path in ns.filename: 
     if path == '-': 
      yield sys.stdin 
     else: 
      yield open(path, 'r') 

업데이트 :

그런 다음 당신은 이런 식으로 뭔가를 할 내가 여러 파일 이름을 원하는 가정, cat 여러 파일 이름을 소요하기 때문이다. 0 또는 하나의 파일 이름을 원할 경우 nargs='?'을 사용할 수 있습니다.

+0

그건 맞습니다. 실제로 nargs 옵션을 사용하여 문서에서 확인했습니다. 내가 싫어하는 것은 사용자가 이것을 볼 수 있다는 것입니다 : 사용법 : do.py [-h] [-s | -m] [파일 이름 [파일 이름 ...]] 그는 파일 이름이 선택 사항임을 실제로 볼 수 있어야하며 단일 값만 가능합니다. – p0lAris

+0

이는 0 또는 1 위치에 대해'nargs = '?' ''가됩니다. http://docs.python.org/dev/library/argparse.html#nargs – msw

+0

@ flippex17 : 문서에서'nargs' 옵션을 보았다고 말할 때 당신을 믿기가 힘듭니다. 왜냐하면 당신이 문서를보고 있었다면 당신은 분명히''? ''를 볼 것입니다 ... –