Lean 4(元)编程 Cookbook

派生子进程🔗

派生子进程🔗

要从 Lean 文件内部运行一个外部程序,我们可以使用 IO.Process.run,它接受一个 IO.Process.SpawnArgs 结构体,并以 String 的形式返回该命令的 stdout。关于可用选项的更多细节,你可以在 Lean4 参考手册中查阅 IO.Process.SpawnArgs

def runExternalProgram (cmd : String) (args : Array String) : IO String := IO.Process.run { cmd := cmd args := args } -- #eval runExternalProgram "curl" #["https://www.test.com"]

如果程序失败(返回非零退出码),IO.Process.run 会抛出异常。要更优雅地处理输出并查看退出码和 stderr,可以使用 IO.Process.output

def runExternalWithOutput (cmd : String) (args : Array String) : IO Unit := do let out IO.Process.output { cmd := cmd args := args } if out.exitCode == 0 then IO.println s!"Command succeeded: {out.stdout}" else IO.println s!"Command failed. Exit Code: {out.exitCode}, Error: {out.stderr}"

如果你想了解进程的更多信息,例如它的 PID,可以使用 IO.Process.spawn 启动进程并获得一个 IO.Process 对象。

def spawnExternalProgram (cmd : String) (args : Array String) : IO Unit := do let proc IO.Process.spawn { cmd := cmd args := args } IO.println s!"Spawned process with PID: {proc.pid}" let exitCode proc.wait IO.println s!"Process exited with code: {exitCode}" -- #eval spawnExternalProgram "touch" #["test.txt"]

获取进程的 PID🔗

要获取你派生的进程的 PID,可以使用 IO.Process.Child.pid 方法。

def getProcessInfo (cmd : String) (args : Array String) : IO Unit := do let proc IO.Process.spawn { cmd := cmd args := args } -- for current process let cpid IO.Process.getPID IO.println s!"Current Process PID: {cpid}" IO.println s!"Child Process PID: {proc.pid}"

要检查一个子进程是否仍在运行,可以使用 IO.Process.Child.tryWait 方法。

为子进程设置环境变量🔗

你可以在派生新子进程时设置环境变量来配置它的环境。记住,无法改变当前进程的环境,因为它已经在运行。

使用 IO.Process.SpawnArgs 时,可以传入一个 env 数组来为新进程指定变量。

def runWithCustomEnv : IO Unit := do let child IO.Process.spawn { cmd := "printenv", args := #["MY_VAR"], env := #[("MY_VAR", "1234")] } let exitCode child.wait IO.println s!"Process exited with code: {exitCode}"

这样就能确保 MY_VAR 对子进程可用,同时不影响父进程的环境。