464 文字
2 分
GitHub Copilot CLI を Python subprocess から呼んでみた【Windows】

はじめに#

Pythonから自動でGitHub Copilot CLIを呼び出したくて、subprocess経由で実行しようとしたところ、なぜか失敗しました。

調べてみると、これはCopilot CLI固有の問題というより、Windows + PowerShell + CLI自動実行でよくある落とし穴だったので、備忘録として共有します。



何が起きたか#

subprocess.run()でCopilot CLIを呼び出そうとすると、以下のような問題に遭遇しました。

  • クォート/エスケープが壊れる"、改行、記号を含むpromptで特に発生)
  • コマンドが長くなりすぎる(長いprompt・長いパスでWinError 206が出ることも)
  • CLIが対話前提で止まってしまう

注意点:--add-dirを付けないとファイル編集できない#

Copilotにファイル編集や出力をさせたい場合、実行時に対象ディレクトリを明示する必要があります。これを忘れると、Copilot側が参照・編集できる範囲に入らず失敗します。

--add-dir "<prompt_dir>"
--add-dir "<out_dir>"

解決策1:PowerShell経由で呼ぶ#

PowerShellの-Commandにまとめると動きやすいです。 私はこれで動きました。

cmd_str = f'powershell.exe -Command "copilot -p \\\"{escaped_prompt}\\\" --model {model} --allow-all-tools --add-dir \\\"{prompt_dir}\\\" --add-dir \\\"{out_dir}\\\""'

解決策2(おすすめ):promptを引数で渡す#

長いコマンドで事故を防ぐには、promptを-Command内に直埋めせずPowerShellのparam経由で引数として渡すのがおすすめです。

import subprocess

ps = r'param($p,$m,$pd,$od) copilot -p $p --model $m --allow-all-tools --add-dir $pd --add-dir $od'

subprocess.run(
    ["powershell.exe", "-NoProfile", "-NonInteractive", "-Command", ps,
     "--", prompt, model, prompt_dir, out_dir],
    text=True,
    capture_output=True,
)

最後に#

PythonからGitHub Copilot CLIを呼んで自動化しようと企んできたのですが、思ったより面倒でした。 どなたかの参考になれば幸いです。

GitHub Copilot CLI を Python subprocess から呼んでみた【Windows】
https://naonao-na.com/posts/githubcopilotcli-call-from-subprocess/
作者
[object Object]
公開日
2025-12-10
ライセンス
CC BY-NC-SA 4.0