gpt4 book ai didi

python - 关于 python 中 pexpect 的问题

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

我尝试从 python 中调用 pexpect 和 subprocess.Popen 来调用外部长期后台进程(该进程使用套接字与外部应用程序通信),详细信息如下。

  1. subprocess.Popen(launchcmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)这很好用。我不需要做任何其他事情。但是,因为我必须立即获取输出,所以我选择 pexpect 来避免管道文件缓冲区问题。

  2. obj= pexpect.spawn(launchcmd, 超时=无)启动外部进程后,我使用单独的线程执行“readline”来读取启动进程“obj”的输出,一切正常。

  3. obj= pexpect.spawn(launchcmd, 超时=无)启动外部进程后,我没有做任何进一步的事情,即,将其留在那里。虽然通过使用“ps -e”命令我可以找到启动的进程,但启动的进程似乎被阻止并且无法在套接字中与其他应用程序进行通信。

好的。更具体地说,我放置了一些示例代码来表达我的问题。

import subprocess
import pexpect
import os

t=1
while(True):
if(t==1):
background_process="./XXX.out"
launchcmd = [background_process]
#---option 3--------
p=pexpect.spawn(launchcmd, timeout=None) # process launced, problem with socket.
#---option 1--------
p=subprocess.Popen(launchcmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # process launced, everything fine
t=0

谁能告诉我第三个选项有什么问题吗?如果是因为我没有使用单独的线程来操作输出,为什么第一个选项适用于 subprocess.popen?我怀疑 pexpect 使用套接字启动进程有问题,但我不确定,特别是考虑到选项 2 效果很好。

最佳答案

我认为你把事情搞得太复杂了。

是的,使用 pty 而不是 pipe 与后台进程通信是个好主意,因为大多数应用程序都能识别 tty/pty 设备并切换到使用无缓冲输出(或至少是行缓冲)。

但是为什么要期待呢?只需使用 Python 的 pty 模块即可。首先调用 openpty 获取一些文件句柄,然后使用 Popen 生成进程。示例代码可在以下问题中找到(带有绿色复选标记的答案)Python Run a daemon sub-process & read stdout

关于python - 关于 python 中 pexpect 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4376640/

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