L01 ch03 — スクリプト実行と shebang
テクノロジ系 / L01 hello — Hello World
L01 ch03 — スクリプト実行と shebang
uv run python xxx.py から ./xxx.py へ — 実行方法を選べる開発者になる
ゴール
python main.pyでスクリプトを実行できるuv run python main.pyとの違いを説明できるshebang(#!/usr/bin/env python) を書いて./main.pyで直接実行できるif __name__ == "__main__":の役割を理解する
スクリプト実行の 3 つの方法
| 方法 | コマンド | 主な用途 |
|---|---|---|
| ① インタプリタ経由 | python main.py | システム Python で実行 |
| ② uv 経由 (推奨) | uv run python main.py | プロジェクト依存を解決して実行 |
| ③ 直接実行 | ./main.py | shebang + 実行権限が必要 |
最小例: ① と ②
# main.py
print("Hello from script")# ① 素の Python (依存パッケージなしの場合だけ安全) python main.py # → Hello from script # ② uv 経由 (FastAPI など依存パッケージを使うならこちら) uv run python main.py # → Hello from script
なぜ uv run が必要か
# プロジェクトに fastapi を入れた uv add fastapi # ❌ システム Python だと import に失敗する python -c "import fastapi" # → ModuleNotFoundError: No module named 'fastapi' # ✅ uv run なら .venv の fastapi を見つける uv run python -c "import fastapi" # → (何も出ない = import 成功)
→ 依存を使うときは uv run を付ける。これだけ覚えれば良い。
shebang で ./main.py を可能にする
#!/usr/bin/env python
# main.py
print("Hello, shebang")# 1. 実行権限を付ける (初回 1 回だけ) chmod +x main.py # 2. 直接実行できる ./main.py # → Hello, shebang
#!/usr/bin/env python の意味:
#!… 「これは実行可能スクリプト」の宣言 (shebang)/usr/bin/env python…PATHからpythonを探して起動
shebang のよくある書き方
#!/usr/bin/env python # OS の python を使う (一般的) #!/usr/bin/env python3 # python3 を明示 #!/usr/bin/python # 絶対パス (環境依存・非推奨)
> 教材では #!/usr/bin/env python を採用する。
> env を経由することで mise / uv / pyenv 等のバージョン管理ツールと協調できる。
if __name__ == "__main__": の役割
# main.py
def greet(name: str) -> str:
return f"Hello, {name}"
if __name__ == "__main__":
# このファイルを直接実行したときだけ動く
print(greet("FastAPI"))python main.pyで実行 →__name__ == "__main__"で True- 他ファイルから
from main import greetで import → False (print されない) - 「ライブラリとしても CLI としても使えるファイル」を作る定番パターン
drill
drill/ — shebang を埋めて ./main.py で直接実行できるようにする
拡張課題
sys.argvでコマンドライン引数を受け取る
import sys
name = sys.argv[1] if len(sys.argv) > 1 else "World"
print(f"Hello, {name}")
./main.py Taro # → Hello, Taro
uv run --scriptで単一ファイルに依存を埋め込む (uv 0.4+)
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = ["httpx"]
# ///
import httpx
print(httpx.get("https://example.com").status_code)
よくある詰まり
| 症状 | 原因 | 対処 |
|---|---|---|
./main.py: Permission denied | 実行権限がない | chmod +x main.py |
./main.py: command not found | shebang が無い / typo | 1行目を #!/usr/bin/env python に |
ModuleNotFoundError | システム Python に依存が無い | uv run python main.py で実行 |
| 直接実行すると違う Python が起動 | env が拾う python が別物 | which python で確認 |
次に学ぶ領域
| 領域 | 続けて読む |
|---|---|
| 関数定義と引数 | function/ch01-basic |
| CLI 引数解析 (argparse) | 将来の chapter |
FastAPI の起動 (uvicorn main:app) | fastapi-basics |
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。