Skip to content

サブプロセスとして起動した際のハング修正:Python subprocess.runなどへの対応

原文(日本語に翻訳)

claude -p がサブプロセスとして明示的なstdinなしで生成された場合(例: Python の subprocess.run)にハングする問題を修正

原文(英語)

Fixed claude -p hanging when spawned as a subprocess without explicit stdin (e.g. Python subprocess.run)

概要

claude -p(プリントモード)をPythonの subprocess.run などから子プロセスとして起動した際に発生していたハング問題が修正されました。以前は、標準入力(stdin)を明示的に指定しない場合にClaude Codeが無限待機状態になることがありました。この修正により、プログラムからClaude Codeを安定して呼び出せるようになります。

基本的な使い方

修正後は、stdinの明示的な指定なしでもClaude Codeをサブプロセスとして正常に利用できます:

python
import subprocess

result = subprocess.run(
    ["claude", "-p", "このコードをレビューしてください"],
    capture_output=True,
    text=True
)
print(result.stdout)

実践例

Python subprocess.runからの呼び出し

python
import subprocess

# 2.1.79以降: stdinを指定しなくてもハングしない
result = subprocess.run(
    ["claude", "-p", "Hello, Claudeと返してください"],
    capture_output=True,
    text=True,
    timeout=60
)
print(result.stdout)  # "Hello, Claude"

明示的なstdinを渡す場合(推奨)

python
import subprocess

# より確実な方法: stdinを明示的にDEVNULLに設定
result = subprocess.run(
    ["claude", "-p", "コードをレビューしてください"],
    stdin=subprocess.DEVNULL,  # 明示的にstdinをクローズ
    capture_output=True,
    text=True,
    timeout=120
)
print(result.stdout)

複数のClaude呼び出しを並列実行

python
import subprocess
from concurrent.futures import ThreadPoolExecutor

tasks = [
    "Pythonのベストプラクティスを3つ教えて",
    "JavaScriptの非同期処理について説明して",
    "SQLのインデックスとは何か説明して"
]

def run_claude(prompt):
    result = subprocess.run(
        ["claude", "-p", prompt],
        capture_output=True,
        text=True,
        timeout=60
    )
    return result.stdout

with ThreadPoolExecutor(max_workers=3) as executor:
    results = list(executor.map(run_claude, tasks))

for task, result in zip(tasks, results):
    print(f"質問: {task}")
    print(f"回答: {result[:100]}...")
    print()

シェルスクリプトからの呼び出し

bash
#!/bin/bash

# サブシェルやシェルスクリプトからも安定して動作
response=$(claude -p "現在のディレクトリのファイル一覧を分析してください" < /dev/null)
echo "$response"

注意点

  • この修正は claude -p--print)モードに適用されます。対話モード(claudeのみ)は影響を受けません
  • プログラムからClaude Codeを呼び出す際は、stdin=subprocess.DEVNULL を明示的に指定することを引き続き推奨します。これにより意図がコードから明確になります
  • タイムアウト設定も合わせて指定することで、予期せぬ長時間待機を防止できます
  • Ctrl+Cが -p モードで正常に動作しない問題も同時に修正されています(Fixed Ctrl+C not working in -p mode)

関連情報