{{tag>[cli python fire argument-parser reflection]}} ====== Python Fire ====== Python function, class, object, module을 reflection으로 탐색해 CLI를 자동 생성하는 library다. ===== Summary ===== * ''fire.Fire(component)'' 한 번으로 Python component를 command tree로 노출한다. * 함수 parameter는 positional argument 또는 named flag로 전달할 수 있다. * 빠른 내부 도구와 탐색용 CLI에 편리하지만 공개 API 범위를 의도적으로 제한해야 한다. ===== Installation ===== 공식 설치 문서는 PyPI와 conda-forge 방법을 제공한다. project virtual environment 사용을 권장한다. # Linux / macOS python3 -m venv .venv source .venv/bin/activate python3 -m pip install fire python3 -c "import fire; print(fire.__version__)" # conda conda install fire -c conda-forge # Windows PowerShell py -m venv .venv .venv\Scripts\Activate.ps1 py -m pip install fire py -c "import fire; print(fire.__version__)" Python Fire가 공식적으로 별도 안내하는 APT, DNF/YUM, Homebrew, ''winget'' package는 없다. Python environment에 설치한다. ===== Usage ===== ==== 함수 하나 노출 ==== import fire def hello(name: str, count: int = 1): """이름을 받아 인사합니다.""" return "\n".join([f"Hello, {name}!"] * count) if __name__ == "__main__": fire.Fire(hello) python3 hello.py World python3 hello.py --name World --count 2 python3 hello.py --help * ''**python3** HELLO.py [NAME] [--name NAME] [--count COUNT]'' ==== 여러 command를 명시적으로 노출 ==== import fire def create(name, admin=False): return {"name": name, "admin": admin} def remove(name, force=False): if not force: raise ValueError("--force is required") return f"removed {name}" if __name__ == "__main__": fire.Fire({"create": create, "remove": remove}) * ''**python3** USERS.py create NAME [--admin]'' * ''**python3** USERS.py remove NAME --force'' ===== Module Execution ===== source를 수정하지 않고 module 또는 file을 Fire로 탐색할 수 있다. python3 -m fire example hello --name=World python3 -m fire example.py hello --name=World * ''**python3** **-m** **fire** MODULE_OR_FILE [MEMBER...] [ARGS...]'' module 전체나 신뢰 경계 밖의 object를 무심코 노출하면 의도하지 않은 public member와 동작까지 CLI에서 접근할 수 있다. production CLI에는 허용할 command를 dict, 함수 또는 전용 class로 명시해 노출 범위를 제한한다. ===== Arguments and Fire Flags ===== * 함수 argument는 위치 또는 ''--name=value'' / ''--name value'' 형태로 전달할 수 있다. * Fire는 입력 문자열을 Python literal 형태로 변환할 수 있다. 문자열 ''"10"''과 숫자 ''10''을 구분하려면 shell quote 단계까지 고려해야 한다. * component 실행 뒤 반환된 object의 member나 method를 계속 이어서 탐색할 수 있다. * Fire 자체 flag는 command argument와 구분하기 위해 isolated ''--'' 뒤에 둔다. # interactive mode python3 app.py command -- --interactive # separator를 X로 변경 python3 app.py item1 item2 X upper -- --separator=X # trace 표시 python3 app.py command -- --trace * ''**--interactive, -i**'' : 실행 context로 interactive mode 진입 * ''**--separator** VALUE'' : component chaining 구분자 변경 * ''**--trace, -t**'' : Fire command 해석 trace 표시 * ''**--verbose, -v**'' : private member 등을 포함한 상세 표시 * ''**--help, -h**'' : 현재 component와 이어서 사용할 수 있는 command 표시 ===== Troubleshooting ===== * shell이 quote를 먼저 제거한다. 문자열 literal을 강제로 전달하려면 shell에 quote 문자 자체가 남도록 escape해야 할 수 있다. * ''--help''가 함수 argument인지 Fire flag인지 모호하면 command 뒤 isolated ''--''를 사용한다. * local file 이름을 ''sys.py'', ''cmd.py'', ''os.py''처럼 표준 모듈과 같게 만들면 import shadowing으로 오류가 날 수 있다. * stable public CLI contract와 엄격한 validation이 중요하면 ''argparse'', Click 또는 Typer처럼 schema를 명시하는 framework가 더 적합할 수 있다. ===== Compatibility ===== * 이 환경에는 Python Fire가 설치되어 있지 않아 live output을 검증하지 않았다. * 자동 type 변환과 노출되는 member는 Python object 구조에 영향을 받으므로 dependency와 Fire version을 고정하고 integration test로 command contract를 확인한다. ===== Help ===== 설치된 environment에서 application별 help와 Fire 자체 flag를 확인한다. python3 app.py --help python3 app.py command -- --help python3 -m fire --help ===== See Also ===== * [[python|Python]] * [[python:argparse:ko|argparse]] * [[python:typer:ko|Typer]] * [[python:click:ko|Click]] * [[https://google.github.io/python-fire/|Python Fire 공식 문서]] * [[https://google.github.io/python-fire/guide/|Python Fire 공식 문서: Guide]] * [[https://google.github.io/python-fire/using-cli/|Python Fire 공식 문서: Using a CLI]] ===== History ===== * codex:: 2026-08-03 Python Fire 설치, component 노출, module 실행, argument와 Fire flag 사용법을 정리. {{indexmenu>.#1|js}}