80 — 도구: 명령 줄에서 말 받기
지금까지의 프로그램은 실행하는 동안 입력을 물었습니다. 진짜 도구는
시작할 때 지시를 읽습니다: nme 실행 dice 6은 아무것도 묻지 않고 육면체
주사위를 굴려야 합니다. 파일 이름 뒤에 적는 말들이 명령 줄 인자이고,
Python은 이것들을 sys.argv 목록에 넣습니다.
단계
import sys가sys.argv를 줍니다: 프로그램 경로와 파일 뒤에 적은 모든 단어.greet.nme로 저장하세요:
실행해 보기 →# greet.nme — 명령 줄에서 받은 이름으로 인사하기. # 실행: nme 실행 greet 미나 import sys name = sys.argv[1] show f"hello {name}"nme 실행 greet 미나hello 미나sys.argv[0]은 프로그램 경로이고sys.argv[1]부터가 진짜 인자입니다 — 일반적인python greet.py 미나명령이 만드는 목록과 같습니다.인자가 없을 때 혼란스러운 오류로 무너지면 안 됩니다.
len(sys.argv)가 단어 수를 세니, 읽기 전에 확인하세요.dice.nme로 저장하세요:
실행해 보기 →# dice.nme — 명령 줄에서 원하는 면 수의 주사위 굴리기. # 실행: nme 실행 dice 6 use random latest import sys if len(sys.argv) < 2: show "usage: nme 실행 dice <sides>" else: sides = int(sys.argv[1]) show random_number(1, sides)nme 실행 dice 63int(sys.argv[1])이 단어"6"을 숫자 6으로 바꿉니다(02의 변환과 같음). 확인이 없으면nme 실행 dice는 빈 목록에서 오류로 무너집니다. 올바른 명령을 보여 주는 "usage:" 줄이 인자 누락에 친절하게 답하는 방법입니다.인자는 명령 줄 도구를 만듭니다: 프로그램 하나, 명령 여러 개. 할 일 목록은 항목을
todo.json에 저장하고(14)add,done,list명령을 받습니다.todo.nme로 저장하세요:
실행해 보기 →# todo.nme — 명령 줄로 명령을 받는 할 일 도구. # 실행: nme 실행 todo add "buy milk" # nme 실행 todo list # nme 실행 todo done 1 use file latest import sys todo_file = "todo.json" def load_todos(): try: return json_load(todo_file) except Exception: return [] def save_todos(todos): json_save(todo_file, todos) def show_todos(todos): for i, item in enumerate(todos): mark = "x" if item["done"] else " " show f"{i + 1}. [{mark}] {item['text']}" command = sys.argv[1] if len(sys.argv) > 1 else "list" todos = load_todos() if command == "add": text = sys.argv[2] if len(sys.argv) > 2 else "no text" todos.append({"text": text, "done": False}) save_todos(todos) show f"added: {text}" elif command == "done": number = int(sys.argv[2]) - 1 todos[number]["done"] = True save_todos(todos) show "marked done" else: show_todos(todos)load_todos는 파일이 아직 없으면 빈 목록을 돌려줍니다 (68의try/except참고),enumerate는 목록에 1부터 번호를 붙입니다. 항목마다text와done깃발이 있는 dict이고 —json_save가 쓰고json_load가 다시 읽는 바로 그 모양입니다.명령을 이어서 도구를 실행해 보세요:
nme 실행 todo add "buy milk" nme 실행 todo add "learn argv" nme 실행 todo done 1 nme 실행 todoadded: buy milk added: learn argv marked done 1. [x] buy milk 2. [ ] learn argv"buy milk"의 따옴표는 두 단어를 한 인자로 묶어 줍니다 — 따옴표가 없으면buy와milk가 각각sys.argv[2],sys.argv[3]이 됩니다.todo.json파일이 실행 사이에 기억하는 도구의 저장소입니다.
직접 해보기
목록을 비우는 clear 명령이나 번호 하나를 지우는 rm 명령
(todos.pop(number))을 추가해 보세요. 주사위 도구를 면 수 목록을 받아
각각 굴리게 바꿔 보세요 (for side in sys.argv[1:]). 그다음 나만의
도구를 만들어 보세요 — 단위 변환기(nme 실행 convert 100 km to mi)가
좋은 첫 번째입니다.
배운 것
sys.argv는 프로그램 경로와 파일 뒤에 적은 모든 단어를 담습니다.len(sys.argv)가 인자 누락을 막고,usage:줄이 올바른 명령을 알려 줍니다.int(sys.argv[1])이 인자 단어를 숫자로 바꿉니다.- 명령 단어(
add,done)와 데이터로 프로그램 하나가 여러 도구가 됩니다 — 61 미니 은행의 메뉴 루프를 시작 전에 미리 받은 버전입니다. - 따옴표가 여러 단어를 한 인자로 묶어 줍니다.