【问题标题】:question about pexpect in python关于python中pexpect的问题
【发布时间】:2011-05-21 13:41:12
【问题描述】:

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

  1. subprocess.Popen(launchcmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 这工作正常。我不需要做任何其他事情。不过因为要马上得到输出,所以选择pexpect来避免管道文件缓冲问题。

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

  3. obj= pexpect.spawn(launchcmd, timeout=None) 启动外部进程后,我没有做任何进一步的事情,即把它留在那里。虽然,通过使用“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 效果很好。

【问题讨论】:

  • 我认为您可能误解了管道和缓冲区之间的区别 - 管道只是一个管道,是否缓冲取决于正在写入它的应用程序(在您阅读之前)。 Readline 正在缓冲——直到你得到一个换行符。 read() 被缓冲,因为它读取直到它得到一个 EOF。您提供的第一个示例应该没问题,如果有要读取的数据,您会得到它,但如果您的 launchcmd 正在缓冲,它不会是即时的。
  • 嗨,synthesizerpatel,感谢您的评论。但我认为这对我的问题没有帮助。
  • @synthesizerpatel:在 Linux 上,管道由内核缓冲。这种缓冲独立于进程内缓冲,到目前为止,我还没有找到关闭它的方法。
  • 您能解释一下您对套接字的含义吗?我在你的代码中看不到它们。

标签: python stdout pexpect


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多