commands.run() 方法在 Sandbox 内运行终端命令。
基础用法
调用commands.run() 并传入命令字符串。返回的结果中包含命令输出。
from ppio_sandbox import PPIO
ppio = PPIO()
sandbox = ppio.sandbox.create()
result = sandbox.commands.run('ls -l')
print(result)
sandbox.kill()
import { PPIO } from 'ppio-sandbox'
const ppio = new PPIO()
const sandbox = await ppio.sandbox.create()
const result = await sandbox.commands.run('ls -l')
console.log(result)
await sandbox.kill()
# 在运行中的 Sandbox 内执行命令(别名:sandbox ex)
ppio sandbox exec <sandboxID> -- echo "hello"
# 后台运行
ppio sandbox exec <sandboxID> -b -- sleep 3
# 设置工作目录 / 用户 / 环境变量
ppio sandbox exec <sandboxID> -c /home/user -u root -e KEY=VALUE -- ls -la
读取命令输出
使用stdout 读取命令打印的内容。
from ppio_sandbox import PPIO
ppio = PPIO()
sandbox = ppio.sandbox.create()
result = sandbox.commands.run("echo hello")
print(result.stdout) # hello
sandbox.kill()
import { PPIO } from 'ppio-sandbox'
const ppio = new PPIO()
const sandbox = await ppio.sandbox.create()
const result = await sandbox.commands.run('echo hello')
console.log(result.stdout) // hello
await sandbox.kill()
后台运行
传入 background 选项即可启动一个长时间运行的进程(例如服务器),而不会阻塞等待它结束。from ppio_sandbox import PPIO
ppio = PPIO()
sandbox = ppio.sandbox.create()
sandbox.commands.run("python3 -m http.server 3000", background=True)
sandbox.kill()
import { PPIO } from 'ppio-sandbox'
const ppio = new PPIO()
const sandbox = await ppio.sandbox.create()
await sandbox.commands.run('python3 -m http.server 3000', { background: true })
await sandbox.kill()
按命令覆盖环境变量
你可以通过envs 选项为单条命令覆盖或追加环境变量,它只对该条命令生效。
from ppio_sandbox import PPIO
ppio = PPIO()
sandbox = ppio.sandbox.create()
result = sandbox.commands.run(
"echo $LOG_LEVEL",
envs={"LOG_LEVEL": "info"}, # 仅对本条命令生效
)
print(result.stdout) # info
sandbox.kill()
import { PPIO } from 'ppio-sandbox'
const ppio = new PPIO()
const sandbox = await ppio.sandbox.create()
const result = await sandbox.commands.run('echo $LOG_LEVEL', {
envs: { LOG_LEVEL: 'info' }, // 仅对本条命令生效
})
console.log(result.stdout) // info
await sandbox.kill()
流式输出
对于长时间运行的命令,可以传入on_stdout / on_stderr(Python)或 onStdout / onStderr(JavaScript)回调,在输出产生时实时接收,而不必等待命令结束。返回的结果中仍包含最终退出码。
from ppio_sandbox import PPIO
ppio = PPIO()
sbx = ppio.sandbox.connect(sandbox_id)
result = sbx.commands.run(
"for i in 1 2 3; do echo line $i; sleep 1; done",
on_stdout=lambda data: print("OUT:", data, end=""),
on_stderr=lambda data: print("ERR:", data, end=""),
)
print("exit code:", result.exit_code)
import { PPIO } from 'ppio-sandbox'
const ppio = new PPIO()
const sbx = await ppio.sandbox.connect(sandboxId)
const result = await sbx.commands.run(
'for i in 1 2 3; do echo line $i; sleep 1; done',
{
onStdout: (data) => process.stdout.write(`OUT: ${data}`),
onStderr: (data) => process.stderr.write(`ERR: ${data}`),
},
)
console.log('exit code:', result.exitCode)