>source

명령 줄 프로젝트에서 작업 중입니다. add 아래 주석으로 표시된 하위 명령 :

import argparse
import sys
def todo(args):
    if args.o =='add':
        print("Added Todo: "+args.x)
        f=open("todo.txt", "a+")
        c= str(count+1)
        p= '\n'+'. '+args.x
        f.write(p)
        f.close()
    elif args.o =='report':
        return 
    elif args.o =='del NUMBER':
        return 
    elif args.o =='done NUMBER':
        return 
    elif args.o =='help':
        print ("Usage :-"+
               "\n"+'$ ./todo add "todo item"           # add a new todo'+
               "\n"+'$ ./todo ls                        # Show remaining todos'+
               "\n"+'$ ./todo del NUMBER                # delete a todo'+
               "\n"+'$ ./todo done NUMBER               # complete a todo'+
               "\n"+'$ ./todo help                      # Show Usage'+
               "\n"+'$ ./todo report                    # Statistics')
    elif args.o =='ls':
        f=open("todo.txt", "r")
        print(f.read())
        f.close()
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('./todo', type=str, default="./todo")
    parser.add_argument('o', type=str, default="add")
    args = parser.parse_args()
    if args.o =='add':                     # <- starting here
        parser.add_argument('x', type=str, default=None)
        args = parser.parse_args()
        sys.stdout.write(str(todo(args)))  # <- ending here
    else:
        a = parser.parse_args()
        sys.stdout.write(str(todo(args)))

Powershell에서이 스크립트를 실행하면 다음과 같은 오류가 발생합니다.

PS E:\python projects\fellowship challenge\python> python todo.py ./todo add " I am soham Das Biswas"
usage: todo.py [-h] ./todo o
todo.py: error: unrecognized arguments:  I am soham Das Biswas

이 문제를 어떻게 해결할 수 있습니까?

  • 답변 # 1

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('./todo', type=str, default="./todo")
    parser.add_argument('o', type=str, default="add")
    args = parser.parse_args()
    print(args)
    
    

    일부 샘플 실행 :

    1301:~/mypy$ python3 stack65328753.py -h
    usage: stack65328753.py [-h] ./todo o
    positional arguments:
      ./todo
      o
    optional arguments:
      -h, --help  show this help message and exit
    
    

    2 개의 문자열 :

    1303:~/mypy$ python3 stack65328753.py todo add
    Namespace(o='add', **{'./todo': 'todo'})
    
    

    추가 :

    1304:~/mypy$ python3 stack65328753.py todo add "extra string"
    usage: stack65328753.py [-h] ./todo o
    stack65328753.py: error: unrecognized arguments: extra string
    
    

    이것은 두 개의 인수를 정의합니다. positionals . 그들은 어떤 종류의 '깃발'문자열이 아니라 위치로 식별됩니다. 첫 번째 문자열은 "./todo"속성에 할당됩니다. args , 두 번째는 "o"입니다. 세 번째 줄을 취할 것이 없습니다.

    두 번째 값에 액세스 할 수 있습니다. args.o ,하지만 args../todo 작동하지 않습니다. 대신 당신은 getattr(args, "./todo") . 따라서 이와 같은 "멋진"이름을 사용하는 것은 일반적으로 좋은 생각이 아닙니다.

    이것들은 필수 위치이기 때문에 default .

    인수를 다음으로 변경하십시오. optionals :

    parser = argparse.ArgumentParser()
    parser.add_argument("--dir", default="./todo")
    parser.add_argument('-o', type=str, default="add")
    args = parser.parse_args()
    print(args)
    print(args.dir, args.o)
    
    

    및 실행 :

    1315:~/mypy$ python3 stack65328753.py -h
    usage: stack65328753.py [-h] [--dir DIR] [-o O]
    optional arguments:
      -h, --help  show this help message and exit
      --dir DIR
      -o O
    1316:~/mypy$ python3 stack65328753.py
    Namespace(dir='./todo', o='add')
    ./todo add
    1316:~/mypy$ python3 stack65328753.py --dir ./mydir 
    Namespace(dir='./mydir', o='add')
    ./mydir add
    1316:~/mypy$ python3 stack65328753.py --dir ./mydir -o subtract
    Namespace(dir='./mydir', o='subtract')
    ./mydir subtract
    1316:~/mypy$ python3 stack65328753.py --dir ./mydir -o "an extra string"
    Namespace(dir='./mydir', o='an extra string')
    ./mydir an extra string
    
    

    다음을 기반으로 "x"인수를 추가하려고합니다. args.o

    args = parser.parse_args()
    if args.o =='add':                     # <- starting here
        parser.add_argument('x', type=str, default=None)
        args = parser.parse_args()
    
    

    하지만 첫 번째 parse_args() 인식 할 수없는 오류를 발생시키고 종료하는 것입니다. 따라서이 추가 작업을 계속하지 않습니다.

    parser = argparse.ArgumentParser()
    parser.add_argument("--dir", default="./todo")
    parser.add_argument('-o', type=str, default="add")
    args, extras = parser.parse_known_args()
    print(args, extras)
    print(args.dir, args.o)
    if args.o == "add":
        parser.add_argument('x')
        args = parser.parse_args()
        print(args)
    
    

    도움말은 변경되지 않습니다. parse 그 행동 :

    1318:~/mypy$ python3 stack65328753.py -h
    usage: stack65328753.py [-h] [--dir DIR] [-o O]
    optional arguments:
      -h, --help  show this help message and exit
      --dir DIR
      -o O
    
    1323:~/mypy$ python3 stack65328753.py --dir ./mydir -o "an extra string"
    Namespace(dir='./mydir', o='an extra string') []
    ./mydir an extra string
    
    

    그만큼 parse_known_args 여분의 문자열을 extras . 이제 계속해서 x 논의:

    1323:~/mypy$ python3 stack65328753.py --dir ./mydir -o add "an extra string"
    Namespace(dir='./mydir', o='add') ['an extra string']
    ./mydir add
    Namespace(dir='./mydir', o='add', x='an extra string')
    
    

    대안은 다음과 같습니다.

    args.x = extras
    
    

    (비어있을 수도 있음) 목록이 될 것입니다.

    이와 같은 문제가 있으면 사용하는 것이 좋습니다. print(args) 파서가 수행하는 작업을 확인합니다. 더 큰 스크립트에 포함하기 전에 파서를 디버그하십시오. 처음에는 너무 화려하게 굴지 마세요. 사용하다 optionals 필수가 아닌 선택 사항 및 positionals 필요한 것들. 이를 변경하는 방법이 있지만 입력 내용을 이해하기 어렵게 만듭니다.

  • 답변 # 2

    인수를 정의하는 방법을 오해 할 수 있습니다. 함수 호출에서 위치 인수로 예제의 인수를 사용할 수 있다고 가정하고 있지만 인수 파서가 작동하는 방식은 아닙니다. 다음은 귀하의 예에서 일어나는 일입니다.

    python todo.py ./todo add " I am soham Das Biswas"
    
    

    "./todo"및 "o"의 두 매개 변수를 정의했습니다. 부분 ./todo add 값을 할당 add ~로 ./todo 논의.

    "나는 soham Das Biswas입니다"는 "o"가 호출에 언급되지 않았기 때문에 "o"에 할당되지 않습니다. "o"에 무언가를 할당하려면 다음과 같은 것이 필요합니다. o value_i_want_to_assign .

    코드로 무엇을 하시겠습니까?

관련 자료

  • 이전 dplyr - r - 일부 조건에 따라 변수 합계
  • 다음 list - 현재 '좌표'에 무작위 바이너리 정보를 추가하려면 어떻게해야합니까? (파이썬)