如何使用python pty模块忽略字符?

时间:2019-02-23 02:58:21

标签: python pty

我想编写一个通过伪终端与其他交互式程序通信的命令行程序。特别是,我希望能够将接收到的击键有条件地发送给基础进程。举个例子,我想默默地忽略发送的所有“ e”字符。

我知道Python有一个{{3}}用于伪终端,并且我有使用它的程序的基本版本:

import os
import pty

def script_read(stdin):
    data = os.read(stdin, 1024)

    if data == b"e":
        return ... # What goes here?
    return data

pty.spawn(["bash"], script_read)

通过实验,我知道返回空字节对象b""会导致pty.spawn实现认为基础文件描述符已到达文件末尾,不应再从中读取,这导致终端变得完全没有响应(我必须杀死我的终端模拟器!)。

1 个答案:

答案 0 :(得分:0)

对于交互式使用,执行此操作的最简单方法可能只是返回一个包含单个空字节的字节对象:b"\0"。终端仿真器不会为其打印任何内容,因此看起来好像完全忽略了输入。

这可能不适用于某些伪终端。特别是,如果写入伪终端的内容将由附加程序再次写入,则可能会导致随机空字节出现在文件中。使用cat作为附件程序进行测试,序列^@会在向终端发送空字节时打印到终端。

YMMV。

一种更合适的解决方案是创建一个包装器类型,该包装器类型可以伪装成os.write的空字符串,但在布尔型上下文中评估为“真实”,不会触发有条件文件的结束。我对此进行了一些试验,无法弄清楚需要假冒什么才能使os.write完全接受包装器作为字符串类型。我不清楚是否有可能。 :(

这是我最初创建这种包装类型的尝试:

class EmptyBytes():
    def __init__(self):
        self.sliced = False

    def __class__(self):
        return type(b"")

    def __getitem__(self, _key):
        return b""