我正在尝试在新的 Linux 命名空间下使用 Python 创建一个子进程。但检查 subprocess 文档 似乎 Python 实际上并没有一个 API 可以做到这一点。我发现的最接近的是
unshare
模块中的 os
方法(here)。但这似乎需要以下步骤:
这与首先创建一个独立的流程并不完全相同。 Python 中确实没有简单的 API 可以实现这一点吗?
作为示例,以下是 Go 中的类似代码:
cmd := exec.Command(...)
cmd.SysProcAttr = &syscall.SysProcAttr {
Cloneflags: syscall.CLONE_NEWUTS
}
cmd.Run()
问题是如何用Python实现同样的效果。
没有其他好的 Python API 可以做到这一点。
os.unshare()
和 os.setns()
是目前唯一用于操作命名空间的 API(自 Python 3.12 起)。 功能请求也提到了这一点:
就目前而言,更改到不同的命名空间确实很混乱,必须使用 ctypes,并调用 libc 函数来完成此操作。 我认为实现 setns 和 unshare 函数将使在 Python 中使用命名空间变得更加容易
您当然可以通过
clone
(加载 C 库)手动发出带有 CLONE_NEWxxx
标志的 ctypes
系统调用,但这会非常混乱并且绝对不安全,因为它不会考虑内部解释器之类的事情锁等