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

问题描述 投票:0回答:1

我想编写一个命令行程序,通过伪终端与其他交互程序进行通信。特别是我希望能够有条不紊地将接收到的击键发送到底层进程。让我们说一个例子,我想静静地忽略发送的任何“e”字符。

我知道Python有一个用于伪终端的pty module,我有一个基本版本的程序正在使用它:

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实现认为底层文件描述符已经到达文件末尾并且不应再被读取,这会导致终端变得完全没有响应(我不得不杀死我的终端模拟器!)。

python pty
1个回答
0
投票

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

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

所以,YMMV。

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

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

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

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

    def __getitem__(self, _key):
        return b""
© www.soinside.com 2019 - 2024. All rights reserved.