当前位置:   article > 正文

【Python】使用 termios、fcntl 模拟终端键盘输入_python fcntl

python fcntl

【Python】使用 termios、fcntl 模拟终端键盘输入

在本篇文章中,我们将逐一讲解以下内容:

  1. 如何通过 python 来模拟终端的键盘输入
  2. 如何控制 docker 中的终端
  3. 为了防止终端意外关闭,如何使用 tmux 来管理终端

一、前言

在最近的工作中我遇到一个十分棘手的问题,就是我需要在测试自动化中使用他人开发的一个【命令行工具】

命令行工具示意图
这个【命令行工具】使用方法需要我在程序开始运行后,通过键盘输入一些选项才能运行,而不是一行命令直接运行,因此无法直接使用 os 模块来让【命令行工具】直接工作,所以想让这样一个工具自动化便成了一个困扰我多日的问题

通过查阅大量的资料,发现其实可以通过 python 来控制某个终端,来模拟用户的键盘输入。现在让我们进入正文

二、用 Python 控制终端

实现方法大概分为一下几步

  1. 获取你想控制的【终端的编号】:如 ttys001
  2. 将上面的编号告诉 python,打开其对应的【文件描述符】
  3. 向【文件描述符】中写入你想用键盘输入的命令
  4. 完成后,关闭【文件描述符】

大概的图示如下,看不懂没有关系,下面有每一步的详细解释

控制示意图

2.1 获取终端编号

首先打开一个终端,并输入 ps,在 TTY 这一列会标志每条进程所属的【终端编号】。通常我们看 bash 或·zsh 的进程所属终端,即为当前的终端。所以如图所示,我目前的终端是 ttys001

终端编号

在 Linux 系统中,每打开一个终端,便会在系统的 /dev 目录下新建一个带有【终端编号】的文件,如 /dev/ttys001 这个文件表示一个串行终端设备

在这里我们只需要知道 /dev/ttys001 代表了当前的终端即可

2.2 在 python 中打开设备

这里直接上代码,十分好理解

# 这里我们使用 open 打开了该终端(写模式)
# 得到了终端的文件描述符 file descriptor,即 fd
fd = open('/dev/ttys001', 'w')
  • 1
  • 2
  • 3

2.3 将命令写入终端

首先贴入完整代码,看不懂没关系,之后会逐行解释

import fcntl
import termios


terminal = "/dev/ttys001"


def terminal_exec(terminal: str, cmd: str):
    """Execute cmd in the specific terminal

    Args:
        terminal (str): the terminal you would like to control
        cmd (str): command line, such as 'ls'
    """
    with open(terminal, "w") as fd:
        for c in "{}\n".format(cmd):
            fcntl.ioctl(fd, termios.TIOCSTI, c)


terminal_exec(terminal, "ls")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在上面的 terminal_exec 函数中,我们首先用 with open(...) as fd 打开了终端,并获取到了文件描述符

然后这段代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/211193
推荐阅读
相关标签