检测tty输出的结束

时间:2010-02-17 03:37:35

标签: python tty control-characters

嗨,我正在写一个可以存在tty的psudo终端,并产生第二个tty,它是来自

的过滤器输入和输出

我现在正在python中编写它,产生第二个tty并且读写很容易

但是当我读到时,读取没有结束,它等待更多的输入。

import subprocess

pfd = subprocess.Popen(['/bin/sh'], shell=True, 
    stdout=subprocess.PIPE, stdin=subprocess.PIPE)

cmd = "ls" 

pfd.stdin.write(cmd + '\n')

out = ''
while 1: 
    c = pfd.stdout.read(1)
    if not c: # if end of output (this never happends)
        break 
    if c == '\n': # print line when found
        print repr(out)
        out = ''
    else:
        out += c

----------------------------- outputs ----------------- -------

intty $ python intty.py 
'intty.py'
'testA_blank'
'testB_blank'
(hangs here does not return)

看起来它已到达hte缓冲区的末尾,而不是返回None或''它等待更多输入。

我应该查看输出是否已完成?缓冲区的结尾?一个不可打印的角色?

----------------编辑-------------

这也发生在我运行xpcshell而不是ls时,我假设这些交互式程序有某种方式知道再次显示提示, 扼杀提示,在这种情况下“js>”永远不会出现

2 个答案:

答案 0 :(得分:1)

好吧,你的输出实际上还没有完成。因为您生成/bin/sh,所以在“ls”完成后shell仍在运行。没有EOF指示器,因为它仍在运行。

为什么不简单地运行/bin/ls

您可以执行类似

的操作
pfd = subprocess.Popen(['ls'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)

out, err_output = pfd.communicate()

这也突出了subprocess.communicate,这是一种更安全的方式来获得输出(对于适合内存的输出,无论如何)来自单个程序运行。只有在程序运行完毕后才会返回。

或者,您可以从shell中逐行读取,但是您正在寻找一个特殊的shell序列,如sh~#行,它可以很容易地显示在程序输出中。因此,运行shell可能是一个坏主意。


编辑以下是我所指的内容,但它仍然不是最佳解决方案,因为它有很多警告:

while 1: 
    c = pfd.stdout.read(1)
    if not c:
        break
    elif c == '\n': # print line when found
        print repr(out)
        out = ''
    else:
        out += c
        if out.strip() == 'sh#':
            break

请注意,如果任何其他命令在行的开头输出'sh#',并且如果由于某种原因输出与预期不同,您将进入与之前相同的阻塞情况。这就是为什么它是一个非常不理想的shell的原因。

答案 1 :(得分:0)

对于像shell这样的应用程序,在shell结束之前输出不会结束。使用select.select()检查是否有更多输出等待您,或者结束该过程。