{{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}}