gpt4 book ai didi

python - 正确链接 Popen 子进程

转载 作者:太空狗 更新时间:2023-10-29 21:59:01 25 4
gpt4 key购买 nike

我有如下结构:

os.mkfifo('pipe.tmp')
enc = Popen(['encoder', '-i', 'pipe.tmp'])
cap = Popen(['capture', '-f', 'pipe.tmp'])

这里 cap 是一个通常写入文件的进程(由 -f 指定),但我可以通过提供 让它将数据喷到屏幕上>/dev/stdout 作为输出文件。类似地,enc 期望从类似文件的对象中读取,并且我能够通过提供 - 作为输入来让它从管道中读取。所以我认为可能不需要特殊文件而不是在操作系统中使用命名管道,我可以使用这样的未命名管道..

cap = Popen(['capture', '-f', '/dev/stdout'], stdout=PIPE)
enc = Popen(['encoder', '-i', '-'], stdin=cap.stdout)
cap.stdout.close()

(还要注意产卵顺序的颠倒)。我更喜欢这个,因为临时文件似乎是不必要的,但我有点担心这个构造是否会按照我期望的方式链接进程。

  1. cap 与之对话的/dev/stdout 是否与操作系统中的实际标准输出不同?也就是说,使用 enc 中的输入管道 - 我将在这两个进程之间获得干净的数据通道,即使其他进程正在与/dev/stdout 聊天操作系统?
  2. 阻塞/排队的行为会有什么显着差异吗?我认为在我的第一个例子中,命名管道将是一个缓冲的 4096 字节,如果 cap/enc 的写入/读取速度不够快,它将在两端阻塞,但是如我错了请纠正我。
  3. 是否需要任何特殊的生成或终止顺序,或者我应该注意的任何其他陷阱?

最佳答案

  1. /dev/stdout 为您提供当前进程的标准输出,因此您应该可以使用它。 (关于/dev/stdout 并没有真正的“全局”)
  2. 第一个示例中的 fifo 大小取决于您的系统配置(我不确定如何更改它)。但是 subprocess.Popen 允许您为其 I/O 操作定义缓冲区大小,因此您应该能够对其进行调整。 更新: 进行更多研究后,我发现不受 bufsize 参数影响的管道有 64kB 的限制。不确定如何解决这个问题(除了更频繁地阅读和手动处理缓冲)
  3. 对于你的第二个例子,看起来你需要按照你给出的顺序开始,因为你需要 cap.stdout 在开始 enc 之前可用。或者,您可以让这两个进程断开连接并手动处理它们之间的通信。

关于python - 正确链接 Popen 子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6646945/

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