CWSANDBOX_API_KEY に設定した CoreWeave API アクセストークンを使用します。Forge の APIキーによる認証については、はじめにを参照してください。CKS の要件については、配置モードを参照してください。
このガイドでは、exec() メソッドを使用してサンドボックスでコマンドを実行する方法を説明します。シェルコマンド、スクリプト、または対話型インタープリターをサンドボックス内で実行し、その出力を取得したり、リアルタイムでストリーミングしたり、stdin に送信したり、非ゼロの終了コードの処理方法を制御したりする場合に使用します。このガイドは、すでに cwsandbox Python クライアントを使用している開発者向けです。
基本的なコマンドを実行する
まず、完了まで実行され、取得した出力を返す単一のコマンドから始めます。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 コンテキストでは、各OperationRef を直接 await します:
stdin=True と stdin=False の使い分け
作業ディレクトリを設定する
デフォルトでは、コマンドはサンドボックスのデフォルトの作業ディレクトリから実行されます。これをcwd で上書きします:
タイムアウトを設定する
コマンドがフリーズしたり予想以上に長く実行される可能性がある場合に停止するには、timeout_seconds でタイムアウトを設定します:
check でエラーを処理する
check パラメーターは、終了コードが 0 以外の場合のエラー処理の動作を制御します。
check=False のデフォルトの動作
終了コードに関係なく結果を返します:失敗時に check=True で例外を送出
非ゼロ終了時にSandboxExecutionError 送出される例外:
Python コードを実行する
サンドボックスは、短い ワンライナーや、インラインで渡す長いスクリプトとして Python コードを実行するためによく使用されます。逐次実行と並列実行の比較
後続のコマンドが先行するコマンドに依存する場合は逐次実行を選びます。コマンドが互いに独立しており、複数のサンドボックスで同時に実行したい場合は並列実行を選びます。順序が重要な場合のコマンドの実行
独立したコマンドを並列に実行する
M 個のプロセスのうち N 個の完了を待機する
cwsandbox.wait() を使用して、一部のプロセスの完了を待機します:
プロセスの制御
exec() の呼び出しが戻った後もコマンドが実行され続ける場合、処理をブロックせずに状態を確認したり、必要に応じて完了を待ったりできます。Process ハンドルには、モニタリングと制御のためのメソッドが用意されています。