gpt4 book ai didi

python - 如何为终端应用程序编写透明包装器?

转载 作者:太空宇宙 更新时间:2023-11-04 10:02:09 24 4
gpt4 key购买 nike

Wrapper 应该处理特殊的控制字符并做一些事情,但不会干扰实际的应用程序。 (尝试构建类似 tmux 的应用程序)

到目前为止,我在文档中有以下修改示例:https://docs.python.org/3/library/pty.html#example

import pty
import os

def handle_special_cmd(data):
# TODO
raise NotImplementedError

def inread(fd):
data = os.read(fd, 1024)
if b'\x02' in data: # ctrl B
return handle_special_cmd(data)
return data

def main():
cmd="vim"
pty.spawn(cmd, stdin_read=inread)

if __name__=='__main__':
main()

上面的代码可以运行,但是打开的 vim 没有覆盖整个终端窗口。它以减少的行和列启动 vim bad vim

如果我只是从 shell 中输入 vim 它就可以正常工作: good vim

为什么会发生这种情况以及如何解决?我的目标不仅仅是修复行和列,而且包装器应该是真正透明的,除了捕获特殊的 ctrl 字符并做一些事情。当前 shell 具有的任何 tty/颜色和其他设置都应该传递给实际的可执行文件。它应该像我键入 vim 一样工作。 (Linux 特定的解决方案很好。不需要在所有 posix 中工作。如果它需要 c 扩展也很好)。

最佳答案

窗口大小是 PTY 本身的唯一属性。您可以使用 TIOCGWINSZTIOCSWINSZ ioctls 获取和设置它:

import sys, fcntl, termios, struct

buf = bytearray(4)
fcntl.ioctl(sys.stdin.fileno(), termios.TIOCGWINSZ, buf)
(h, w) = struct.unpack("HH", buf)
print("Terminal is {w} x {h}".format(w=w, h=h))

[...]

fcntl.ioctl(child_pty.fileno(), termios.TIOCSWINSZ, struct.pack("HH", h, w))

关于python - 如何为终端应用程序编写透明包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55363345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com