gpt4 book ai didi

python - 从 python 子进程中的 fd#3 读取

转载 作者:太空宇宙 更新时间:2023-11-03 19:01:35 25 4
gpt4 key购买 nike

我正在为 Debian 的 debootstrap 实用程序编写一个 python 前端。 Debootstrap 可以输出进度信息,但如果 file descriptor #3 is open, and it writes to this fd 则会输出进度信息。 .

我找到了some hints ,但我无法理解如何在Python中做到这一点。

如何在 Python 中创建 fd#3、运行 debootstrap 子进程并从 fd#3 读取?

最佳答案

我认为您需要使用低级操作系统 API 在 fd 3 上设置管道,例如:

import os, sys

# No other fds have been opened, so the lowest available are used (3, 4)
read, write = os.pipe()

# We want the child to write into fd#3, but right now that's the read
# end of the pipe, so do a little switching around:
temp = os.dup(read)
os.dup2(write, read)
os.dup2(temp, write)
os.close(temp)
read, write = write, read # swap actual values to avoid confusion

pid = os.fork()
if pid == 0: # child
os.close(read)
try:
os.execl('/bin/bash', 'bash', '-c', 'echo testing...>&3')
except OSError:
sys.exit(1)
else: # parent
os.close(write)
progress = os.fdopen(read)
print progress.read()
os.wait()

基本上,创建管道,并交换读/写端,以便写入端位于 fd#3 上(将使用最低的可用 fd,因此请确保您尚未打开任何其他 fd)。

然后, fork 并关闭父级和子级中适当的管道端部。然后我们可以在子进程中执行目标,在我的例子中我使用 bash 作为示例。然后,在父级中,我们可以围绕管道的读取端构建一个普通的类似文件的对象,并继续执行它,而不必担心低级 API。

如果您在管道的读取端设置FD_CLOEXEC,则可能可以使用subprocess模块,但您仍然需要执行低级调用设置管道,因此这样做没有太大好处。

关于python - 从 python 子进程中的 fd#3 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15910818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com