Skip to main content
このガイドでは、exec() メソッドを使用してサンドボックスでコマンドを実行する方法を説明します。シェルコマンド、スクリプト、または対話型インタープリターをサンドボックス内で実行し、その出力を取得したり、リアルタイムでストリーミングしたり、stdin に送信したり、非ゼロの終了コードの処理方法を制御したりする場合に使用します。このガイドは、すでに cwsandbox Python クライアントを使用している開発者向けです。

認証を選択する

CKS が指定されているセクションを除き、これらの例はサーバーレスキャパシティ上で実行されます。サンドボックスを所有するアカウントの認証情報を選択してください。キーまたはトークンの取得方法については、認証情報の選択と取得を参照してください。 インストールコマンドは、有効化した Python 仮想環境で実行してください。 使用する認証情報のタブにある Python コードを、このページで実行する Python スクリプトと同じディレクトリに sandbox_auth.py として保存します。このファイルに保存されるのはどの認証方法を使うかという選択内容であり、認証情報そのものではありません。各例ではこのファイルから AUTH をインポートし、新しいサンドボックスやセッションを作成するたびに明示的に渡します。
SDK の W&B 認証方式で、Forge の APIキーを使用します。
sandbox_auth.py
CKS に配置する場合は、CoreWeave トークンを選択し、ランナーを有効化したうえで、サンドボックスの作成時または SandboxDefaults で placement_mode="cks" を設定します。auth=AUTH を指定してセッションを作成すると、そのセッションが所有するサンドボックスも認証されます。サンドボックスへの再接続、一覧表示、クリーンアップの際も、同じ認証情報を使用してください。

基本的なコマンドを実行する

まず、完了まで実行され、取得した出力を返す単一のコマンドから始めます。exec() メソッドは Process ハンドルを返します:

結果を取得

exec() はすぐに返るので、コマンドの待機方法を決定できます。出力が得られるまで待機するには、Process ハンドルの .result() を呼び出します:

出力のストリーミング

.result() でブロックすると、コマンドが終了するまで出力は表示されません。進捗をリアルタイムで確認するには、.result() を呼び出す前に process.stdout を反復処理します:
次のことが必要な場合は、ストリーミングを使用します。
  • 長時間実行されるプロセスを監視する。
  • 出力を受信するたびに処理する。
  • 進行状況を示すインジケーターを実装する。

stdin への入力のストリーミング

一部のコマンドは、パイプラインや対話型インタープリター、EOF まで読み込むツールなど、実行中に stdin への入力書き込みを必要とします。stdin=True を指定して stdin を有効にすることで、実行中のコマンドに入力を送信できます:

StreamWriter のメソッド

stdin=True の場合、process.stdin は次の 3 つのメソッドを持つ StreamWriter です。
  • write(data: bytes): 生のバイト列を書き込みます。OperationRef[None] を返します。
  • writeline(text: str): 末尾に改行を付けてテキストを書き込みます (UTF-8 にエンコードされます)。OperationRef[None] を返します。
  • close(): EOF を通知します。システムは保留中の書き込みを先に完了します。OperationRef[None] を返します。
stdin=False (デフォルト) の場合、process.stdin は None です。

複数回の書き込みを送信する

閉じる前にデータを段階的に送信します:

stdin 経由で対話型 Python を実行する

対話型インタープリターに Python コードを入力します:

stdin と stdout のストリーミングを組み合わせる

入力を送信しながら出力をストリーミングします:

EOF に依存するコマンドの処理

一部のコマンド (sort など) は、すべての入力を読み取ってから出力を生成します。stdin を閉じて EOF を通知します:

Async コンテキストで stdin を使用する

Async コンテキストでは、Sandbox(...) を使用します。これにより、非同期コンテキストマネージャーがイベントループをブロックせずにサンドボックスを起動します。各 OperationRef は await します:

stdin=True と stdin=False の使い分け

作業ディレクトリを設定する

デフォルトでは、コマンドはサンドボックスのデフォルトの作業ディレクトリから実行されます。これを cwd で上書きします:
パスは絶対パスでなければなりません。

タイムアウトを設定する

アタッチした状態で長時間実行するコマンドには、exec() に timeout_seconds の値を明示的に渡します。たとえば、30 分かかるブートストラップには 1800 を指定します。プロセスの出力は、出力のストリーミング で説明しているメソッドを使用して取得します。exec リクエストのデフォルトのタイムアウトは 300 秒です。また、サンドボックスの有効期間もコマンドの実行時間をカバーしている必要があります。exec のタイムアウトを長くしても、クライアントが切断された場合にコマンドの実行が維持されるわけではありません。 コマンドがフリーズしたり予想以上に長く実行される可能性がある場合に停止するには、timeout_seconds でタイムアウトを設定します:

check でエラーを処理する

check パラメーターは、終了コードが 0 以外の場合のエラー処理の動作を制御します。

check=False のデフォルトの動作

終了コードに関係なく結果を返します:

失敗時に check=True で例外を送出

非ゼロ終了時に SandboxExecutionError 送出される例外:

Python コードを実行する

サンドボックスは、短い ワンライナーや、インラインで渡す長いスクリプトとして Python コードを実行するためによく使用されます。

逐次実行と並列実行の比較

後続のコマンドが先行するコマンドに依存する場合は逐次実行を選びます。コマンドが互いに独立しており、複数のサンドボックスで同時に実行したい場合は並列実行を選びます。

順序が重要な場合のコマンドの実行

独立したコマンドを並列に実行する

M 個のプロセスのうち N 個の完了を待機する

cwsandbox.wait() を使用して、一部のプロセスの完了を待機します:

プロセスの制御

exec() の呼び出しが戻った後もコマンドが実行され続ける場合、処理をブロックせずに状態を確認したり、必要に応じて完了を待ったりできます。Process ハンドルには、モニタリングと制御のためのメソッドが用意されています。
最終更新日 2026年11月4日