python - 为什么 Pexpect 在执行某些命令后间歇性挂起(未检测到 EOF)?

标签 python spawn pexpect

上下文:

我有一些使用 pexpect 编写的代码,其工作是提供命令的“实时”输出。 IE。当命令生成一些输出时或之后不久打印出一些东西,而不是等到命令完成然后与它的输出交互。

我所做的只是启动和停止服务。我通过 spawn 处理过程来做到这一点,然后在打印时输出每一行,如下所示:

def watch(process):
    output = ""
    while True:
        try:
            line = process.read_nonblocking(timeout = -1)
            print(line, end ="")
            output += line
        except pexpect.EOF:
            break
    del process
    return output

while True:
    print("IN 1")
    process = pexpect.spawn("service",["zend-server", "stop"], timeout = None)
    watch(process)
    print("OUT 1")

    print("IN 2")
    process = pexpect.spawn("service",["zend-server", "start"], timeout = None)
    watch(process)
    print("OUT 2")

这段代码应该只是循环服务:一遍又一遍地启动和停止它,打印启动/停止的输出。它可以很好地打印输出。然而,它最终在“OUT 2”之前挂起。我可以查看输出,并看到 service 调用停止执行。但是,watch 函数从不引发 EOF 并退出。

并非每项服务都会发生这种情况。一些服务无限循环。但是,zend-server 以及其他一些不相关的命令会以同样的方式间歇性地失败。

所谓“最终挂起”,我的意思是它启动/停止服务几次(每次运行都不同),然后挂起。它通常在 4 到 6 点后出现问题,但从来没有在第一次调用时发生——至少在第二次调用时总是如此(因此出现了 del 语句;我想我会谨慎行事)。

Python 2.6.6、CentOS (64) 6.3、Pexpect 2.3-6、FWIW

问题:

为什么 pexpect 卡在某些命令上?我应该如何解决这个问题? 使用超时不是一个可行的解决方案,因为其中一些命令确实可以运行任意长时间。 service zend-server stop 只是我选择的示例,因为它不需要那么长时间,而且我可以观察到它完成。

我尝试过的:

我尝试用下面的方法替换 watch 方法,它使用 expect('\n'),但结果是一样的:可变数量的重新启动,然后最终挂起。

我还可以将 pexpect.EOF 添加到与 \n 一起被 expect 的数组中,并处理要中断的返回值在循环之外,它仍然卡在同一个地方。

def watch2(process):
    output = ""
    done = False
    while True:
        try:
            if not process.isalive():
                line = process.readline()
                done = True
            else:
                process.expect(['\n'])
                line = process.before
             print(line)
            output += line
            if done:
                raise pexpect.EOF(0)
        except pexpect.EOF:
            break
    del process
    return output

最佳答案

看起来像是 pexpect 正在等待更多数据的缓冲问题。您可以尝试通过将 maxread=1 传递给 pexpect.spawn()

来禁用缓冲

关于python - 为什么 Pexpect 在执行某些命令后间歇性挂起(未检测到 EOF)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12647212/

相关文章:

python - 无法让 Jupyter 读取 CSV 文件 - 错误 - 找不到文件

Python 3 子进程 SIGABRT

perl - 为什么 Perl 的 "system (' 某些命令')"与 c :\> some command? 的行为不同

python - 使用 pexpect 从 Linux 终端的目录中删除多个文件

python - 如何生成终端?

python - Julia 字符串格式 "if"

python - 为什么 (python|ruby) 被解释?

windows - 如何在 Windows 上生成一个进程并查看它使用了哪些文件?

node.js - 如何在 Node 中的 child.process.exec 中使用的命令中转义 URL 中的字符

python - 索引 81 处不支持格式字符 '@' (0x40)