我想编写一个命令行程序,通过伪终端与其他交互程序进行通信。特别是我希望能够有条不紊地将接收到的击键发送到底层进程。让我们说一个例子,我想静静地忽略发送的任何“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
实现认为底层文件描述符已经到达文件末尾并且不应再被读取,这会导致终端变得完全没有响应(我不得不杀死我的终端模拟器!)。
对于交互式使用,最简单的方法是返回一个包含单个空字节的字节对象: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""