PythonからGeminiCLIを呼び出していろいろ活用したかった

お疲れ様です。

最近はCLIのAIエージェントが流行っていますよね…! 私も「GeminiCLI」をよく使っています。ほぼ無料で使えるのが良い!

この「GeminiCLI」をPythonのコード上でうまく活用できないかいろいろと考えてみました。



Python上でコマンドを呼び出す方法

PythonCLIのコマンドを呼び出したい場合は標準モジュールの「subprocess」を使うのが一般的かなと思います。

docs.python.org

基本的にsubprocess.run()でコマンドを実行する形になります。 subprocess.Popenで別プロセスで呼び出すこともできますが、今回の場合は必要ないかなと思います。

import subprocess

command = ["dir", "/B"] # フォルダ内のファイルとフォルダを表示

# コマンドを実行します
result = subprocess.run(
    command,
    capture_output=True,
    text=True,
    check=True,
    encoding='cp932' if sys.platform == "win32" else "utf-8",
    shell=True 
)

作成したコード

作成したコードはこちらにあります。 ちなみに、READMEのファイルの説明部分はGeminiCLIで作成しました。 github.com

Python+GeminiCLIを試す

実際にGeminiCLIを使ってみます。
GeminiCLIの導入方法や使用可能なコマンド等はこちらがめちゃくちゃ参考になります。 zenn.dev

イメージとしては、Pythonで書いた処理の途中で特定の操作をGeminiCLIにやってもらう感じです。 具体的な活用方法は思いついていませんが、一旦は使えるかどうか試してみようと思います。

単純に「Gemini」コマンドを実行したときの挙動確認

結論から言うと、通常の「gemini」コマンドだと対話モードになり、立ち上がったエージェント上で質問内容を入力する必要があるので、今回やりたいこととしては使えなさそうです。(想定内です。)

まずは単純にcommand=["gemini"]で動かしてみましたが、動作せず。 標準出力にGeminiCLI起動時の表示が残っているのみでした。 ちなみにencoding='cp932'だと文字コードのエラーになりました。

command=["gemini"]

result = subprocess.run(
    command, capture_output=True, text=True, 
    check=True, encoding='utf-8', shell=True 
)

geminiコマンドのみ

次にcommand=["start", "gemini"]で動かしてみました。「start」は指定されたコマンドを実行するために別のウィンドウを表示するコマンドです。
こちらは別ウィンドウが開いていつも通りの操作ができるのですが、出力を取り出すといったことはできなさそうです。

command=["start", "gemini"]

result = subprocess.run(
    command, capture_output=True, text=True, 
    check=True, encoding='utf-8', shell=True 
)

start gemini

非対話モードを使ってみる

GeminiCLIの非対話モードはgemini --prompt [質問文]で実行できます。
結果的にはこちらが使えそうです。

コードとしてはこのように書いてみました。
質問文を外部ファイル(prompt.txt)に記載しそれを読み込み、必要があれば文字列のフォーマットで変数を埋め込み、改行文字を除いた後、gemini --prompt [質問文]の形でコマンド実行という感じです。

今回は作成したPythonファイル自体を説明させています。

  • コード
target = "execute_gemini.py"
    
# プロンプトを読み込み
with open("./prompt.txt", mode="r", encoding="cp932") as f:
    prompt_text = f.read()
    
# パスの指定を埋め込み
prompt_text = prompt_text.format(target=target)
# 改行を除く(改行コードまでの文字列しか参照されないため)
prompt_text = prompt_text.replace("\n", "")

print("--- 入力 ---")
print(prompt_text)

# 実行するCLIコマンド
command = ["gemini", "--prompt", prompt_text]

# コマンドを実行します
result = subprocess.run(
    command, capture_output=True, text=True, 
    check=True, encoding='utf-8', shell=True 
)
  • プロンプト
現在のフォルダ内にある{target}の内容を説明してください。

出力はこんな感じになりました。 output

所感

このように一応PythonでGeminiCLIを実行して結果を取得することができました。
ただ、ファイル作成など実行の許可を入力しないといけない場合などは、非対話モードではうまく動作できませんでした。何か方法はあるんですかね…? allow

結局これをどう活用するかはあまり良いアイデアは浮かびませんでした…。
普通にAIと対話するだけならAPIを使った方がいいので、CLIツールならではの使い方ができればなお良さそうです。
また、GeminiCLIについてもいろいろと勉強しないといけないですね…!