採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

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.pyshebang + 実行権限が必要

最小例: ① と ②

# 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 pythonPATH から 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 で直接実行できるようにする

拡張課題

  1. sys.argv でコマンドライン引数を受け取る
   import sys
   name = sys.argv[1] if len(sys.argv) > 1 else "World"
   print(f"Hello, {name}")
   
   ./main.py Taro   # → Hello, Taro
   
  1. 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 foundshebang が無い / typo1行目を #!/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
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。