argparse에서 하위 명령을 사용하여 구문 분석기를 만들고 위치 인수를 사용자 지정합니다.

user3056783

저는이 모듈을 처음 접했으므로 참아주세요. 다음 코드가 있습니다.

reader.py

import argparse

parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('filename', help='TXT file', type=file, nargs='+')
parent_parser.add_argument('--verbose', '-v', action='store_true', 
        help="Verbosity on")

child_parser = parent_parser.add_subparsers(title="subcommand",
        help="Subcommand help")
new_file_command = child_parser.add_parser('new', help="New text file")
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")

args = parent_parser.parse_args()

내가 달성하려는 것은 파서와 유닉스 명령 줄 유틸리티가 작동하는 방식의 표준 방식이 아닐 수도 있습니다. 그것이 사실이라면 표준화 된 앱을 갖고 싶어서 정정 해주세요.

이것이 내가 달성하려는 것입니다.

  • 다음과 같은 위치 인수를 사용하여 베어 스크립트를 실행하는 경우 : python reader.py some.txt그냥 구문 분석하고 텍스트 파일을 읽는 함수에 전달할 수 있기를 원합니다. 물론 선택적 인수 verbose허용하고 싶습니다.
  • 하위 명령 'new'( new_file_command) 를 실행하면 위치 인수 filename가 필요하지 않고 대신 문자열을 전달하고 다음과 같은 새 텍스트 파일을 만들고 싶습니다.python reader.py new another.txt
  • 하위 명령 'edit'( edit_file_command) 를 실행하면 기존 파일을 경로에 전달하고 ( type=int에서 사용하는 것과 같이) 확인한 add_argument다음 다음과 같이 편집기를 여는 함수에 전달할 수 있습니다.python reader.py edit some.txt

다시 말하지만 이것이 명령 줄 앱 / 스크립트가 어떻게 작동해야하는지 확실하지 않습니다. 나는 문서를 읽고 예제를 보았지만 여전히 하위 파서가 어떻게 작동하는지 명확하지 않습니다. 클릭 모듈을 살펴 보았지만 더 복잡해 보입니다.

도움을 주시면 감사하겠습니다. 감사!

hpaulj

따라서 세 가지 샘플 호출은 다음과 같습니다.

python reader.py some.txt 
python reader.py new another.txt
python reader.py edit some.txt

이를 처리하는 가장 쉬운 방법은 하나의 '선택적'위치와 하나의 필수 위치를 사용하는 것입니다.

parser = ArgumentParser...
parser.add_argument('-v','--verbose', ...)
parser.add_argument('cmd', nargs='?', default='open', choices=['open','edit','new'])
parser.add_argument('filename')

3 개의 샘플에 대해 다음과 같은 결과가 생성됩니다.

namespace(cmd='open', filename='some.txt')
namespace(cmd='new', filename='another.txt')
namespace(cmd='edit', filename='some.txt')

cmd선택적 위치 인수입니다. 이 누락 된 경우 하나 개의 문자열에 할당됩니다 filename, 그리고 cmd그것의를 가져옵니다 default. subparsers선택 사항을 만드는 것보다이 작업을 수행하는 것이 더 쉽습니다 .


현재 파서의 경우 :

parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('filename', help='TXT file', type=file, nargs='+')

사용하지 않는 것이 좋습니다 type=file. 더 나은 사용하기 FileType또는 기본 문자열 (수 있습니다 당신은 파일을 열 with context이상).

에 관해서 nargs='+'는 정말 1 or more문자열을 할당 filename하시겠습니까? 아니면 '?'를 생각하고 계 0 or 1셨나요?

parent_parser.add_argument('--verbose', '-v', action='store_true', 
        help="Verbosity on")

child_parser = parent_parser.add_subparsers(title="subcommand",
        help="Subcommand help")
new_file_command = child_parser.add_parser('new', help="New text file")
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")

이 혼합 filenamesubparsers 인수, 값의 가변 수를 받아들이는 위치를 (a 위치하는 것을 기대하는 하나 new또는 edit) 문제가 될 수있다.

나는 'python reader.py some.txt'subparser 명령이 없다는 것을 반대 할 것으로 예상 한다. , 및 하위 구문 분석기 'python reader.py new another.txt'에 할당 new시도 하고 오류를 발생시킵니다.filenameanother.txt

다음 세 가지 경우 모두에서 subparsers 명령을 기대하는 것이 좋습니다.

parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('--verbose', '-v', action='store_true', 
        help="Verbosity on")
child_parser = parent_parser.add_subparsers(title="subcommand",
        help="Subcommand help", dest='cmd')
open_file_command = child_parser.add_parser('open', help="Open text file")
open_file_command.add_argument('filename', help='TXT file')
new_file_command = child_parser.add_parser('new', help="New text file")
new_file_command.add_argument('filename', help='TXT file')
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")
edit_file_command.add_argument('filename', help='TXT file')

'open', 'new', 'edit'의 각 명령에는 'filename'이 필요합니다.

open명령을 사용하지 않으려는 것은 가치가있는 것보다 더 많은 어려움을 초래할 것입니다.

(최신 argparse에는 하위 구문 분석기를 선택적으로 만드는 버그 / 기능이 있지만 실제로 문제를 모르고서는이를 이용해서는 안됩니다.)


와:

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose') 
parser.add_argument('cmd', nargs='?', default='open', 
    choices=['open', 'edit', 'new']) 
parser.add_argument('filename', nargs='+') 

나는 reader.py new customstring것으로 기대 한다

namespace(cmd='new', filename=[customstring])

다음과 같이 사용할 수 있습니다.

if args.cmd=='new':
with open(args.filename[0] + '.txt', 'w') as f:
     # do something with the newly created file

openedit다른 사용합니다 open모드.


Py3에서는 subparsers필요하지 않습니다. 즉, 하위 명령 중 하나가 제공되지 않으면 오류가 발생하지 않습니다. 이는 초기 버전에서 의도 치 않게 변경된 것입니다.

필수 하위 구문 분석기가있는 Argparse

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관