python终端指令大全_使用python模拟命令行终端的示例

可以对?显示帮助信息,需要立即获取输入的字符,因此需要用到termios模块

另外需要对tab键做处理,当按下tab键时可以进行自动补全

#! /usr/bin/env python

# coding=utf-8

import os

import sys

import tty

import termios

'''

Enter: 13

Back: 127

?: 63

C-h: 8

C-w: 23

Tab: 9

C-u: 21

C-c: 3

C-d: 4

C-\: 28

SPACE: 32

'''

CLI_KEY_CNCR = 13

CLI_KEY_BACK = 127

CLI_KEY_QMARK = 63

CLI_KEY_CTRLH = 8

CLI_KEY_CTRLW = 23

CLI_KEY_TAB = 9

CLI_KEY_CTRLU = 21

CLI_KEY_CTRLC = 3

CLI_KEY_CTRLD = 4

CLI_KEY_QUIT = 28

CLI_KEY_SPACE = 32

CLI_KEY_TABLEN = 4

class CLI(object):

def __init__(self):

self.line = ''

self.line_complete = ''

self.completer_on = False

self.completer_dict = {}

self.completer_dict_keys = self.completer_dict.keys()

self.completer_id = 0

self.completer_cnt = len(self.completer_dict)

def getch(self):

fd = sys.stdin.fileno()

old_settings = termios.tcgetattr(fd)

try:

tty.setraw(fd)

ch = sys.stdin.read(1)

finally:

termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

return ch

def completer_kw_update(self):

self.completer_dict_keys = self.completer_dict.keys()

self.completer_dict_keys.sort()

self.completer_cnt = len(self.completer_dict)

def completer_kw_add(self, key, word):

self.completer_dict[key] = word

self.completer_kw_update()

def completer_kw_clear(self):

self.completer_dict.clear()

self.completer_id_update()

def completer_id_update(self):

self.completer_kw_update()

if self.completer_id < self.completer_cnt - 1:

self.completer_id += 1

else:

self.completer_id = 0

def completer_wd_select(self, word):

if not word:

return ''

cnt = self.completer_cnt

while cnt>0:

completer = self.completer_dict_keys[self.completer_id]

self.completer_id_update()

cnt -= 1

if word == completer[:len(word)]:

return completer[len(word):]

return ''

def printf(self, info=''):

sys.stdout.write(info)

def show_spec_len_str(self, info, maxlen, spacech=' '):

'display a string of the specified length'

maxlen = maxlen

infolen = len(info)

if maxlen < infolen:

maxlen = infolen

while infolen>0:

ch = info[-infolen]

for i in range(self.char_memory_len(ch)):

self.printf(info[i-infolen])

infolen -= self.char_memory_len(ch)

maxlen -= self.char_display_len(ch)

while maxlen>0:

self.printf(spacech)

maxlen -= self.char_display_len(spacech)

def show_help_info(self):

if self.completer_on:

line = self.line_complete

else:

line = self.line

lastwd = ''

show_all = False

if not line or line[-1] == ' ':

show_all = True

else:

lastwd = line.split()[-1]

if self.completer_dict:

maxlen = max([len(info) for info in self.completer_dict])

else:

maxlen = 12

for info in self.completer_dict:

if show_all or lastwd == info[:len(lastwd)]:

self.printf(' ')

self.show_spec_len_str(info, maxlen)

self.printf(' ')

self.printf(self.completer_dict[info])

self.printf('\r\n')

def is_chinese_char(self, ch):

return ord(ch) > 127

def char_display_len(self, ch):

if self.is_chinese_char(ch):

return 2

elif ord(ch) == CLI_KEY_TAB:

return CLI_KEY_TABLEN

else:

return 1

def char_memory_len(self, ch):

if self.is_chinese_char(ch):

return 3

else:

return 1

def rm_last_char(self, line):

lastch = ''

rmlen = 0

if len(line)>0:

lastch = line[-1]

self.printf('\b \b' * self.char_display_len(lastch))

rmlen = self.char_memory_len(lastch)

if len(line) >= rmlen:

line = line[:-(rmlen)]

else:

rmlen = len(line)

line = ''

return rmlen, line

def rm_last_word(self, line):

lastwd = ''

linelen = len(line)

rspacelen = linelen - len(line.rstrip())

if not linelen:

return line

lastwd = line.split()[-1]

backlen = len(lastwd) + rspacelen

rmlen = 0

while backlen>0 and line:

rmlen, line = self.rm_last_char(line)

backlen -= rmlen

return line

def rm_one_line(self, line):

rmlen = 0

while line:

rmlen, line = self.rm_last_char(line)

return line

def do_line_complete_proc(self):

line = self.line

line_complete = self.line_complete

lastwd = ''

self.printf('\r\n')

if self.line_complete:

self.printf(self.line_complete)

else:

self.printf(self.line)

if not line:

return line

lastwd = line.split()[-1]

completer = self.completer_wd_select(lastwd)

if not completer.strip():

self.line_complete = line

return line

backlen = len(line_complete) - len(line)

while backlen>0 and line_complete:

rmlen, line_complete = self.rm_last_char(line_complete)

backlen -= rmlen

self.printf(completer)

line_complete = line + completer

self.line_complete = line_complete

def do_line_complete_end(self):

if self.completer_on:

self.line = self.line_complete

self.line_complete = ''

self.completer_on = False

def get_line(self):

self.line = ''

self.line_complete = ''

self.completer_on = False

while True:

ch = self.getch()

if ch == '\r' or ch == '\n':

self.do_line_complete_end()

self.printf('\r\n')

break

elif ord(ch) == CLI_KEY_BACK or ord(ch) == CLI_KEY_CTRLH:

if self.completer_on:

rmlen, self.line_complete = self.rm_last_char(self.line_complete)

else:

rmlen, self.line = self.rm_last_char(self.line)

self.do_line_complete_end()

elif ord(ch) == CLI_KEY_QMARK:

self.printf('?')

self.printf('\r\n')

self.show_help_info()

if self.completer_on:

self.printf(self.line_complete)

else:

self.printf(self.line)

elif ord(ch) == CLI_KEY_CTRLW:

if self.completer_on:

self.line_complete = self.rm_last_word(self.line_complete)

else:

self.line = self.rm_last_word(self.line)

self.do_line_complete_end()

elif ord(ch) == CLI_KEY_TAB:

self.completer_on = True

self.do_line_complete_proc()

elif ord(ch) == CLI_KEY_CTRLD:

if self.line:

return self.line

else:

return ch

elif ord(ch) == CLI_KEY_QUIT:

self.printf('\r\n Interrupted by .\r\n')

sys.exit()

elif ord(ch) == CLI_KEY_CTRLU:

if self.completer_on:

self.line_complete = self.rm_one_line(self.line_complete)

else:

self.line = self.rm_one_line(self.line)

self.do_line_complete_end()

elif ord(ch) == CLI_KEY_SPACE:

self.printf(ch)

if self.completer_on:

self.line_complete += ch

else:

self.line += ch

else:

self.printf(ch)

self.do_line_complete_end()

self.line += ch

# chinese qmask proc

if ord(ch) == 159 and len(self.line)>= 3 and self.line[-3:] == '\xef\xbc\x9f':

self.printf('\r\n')

self.line = self.line[:-3]

self.show_help_info()

self.printf(self.line)

return self.line

def get_raw_line(self):

self.raw_line = ''

while True:

ch = self.getch()

if ch == '\r' or ch == '\n':

self.printf('\r\n')

break

elif ord(ch) == CLI_KEY_BACK or ord(ch) == CLI_KEY_CTRLH:

rmlen, self.raw_line = self.rm_last_char(self.raw_line)

elif ord(ch) == CLI_KEY_CTRLW:

self.raw_line = self.rm_last_word(self.raw_line)

elif ord(ch) == CLI_KEY_TAB:

self.printf(' ' * self.char_display_len(ch))

self.raw_line += ch

elif ord(ch) == CLI_KEY_CTRLD:

if self.raw_line:

return self.raw_line

else:

return ch

elif ord(ch) == CLI_KEY_QUIT:

self.printf('\r\n Interrupted by .\r\n')

sys.exit()

elif ord(ch) == CLI_KEY_CTRLU:

self.raw_line = self.rm_one_line(self.raw_line)

else:

self.raw_line += ch

self.printf(ch)

return self.raw_line

def test():

cli = CLI()

help_info = {

'hello0': 'say hello 0',

'hello1': 'say hello 1',

'hellohello': 'say hello hello',

'hellohehe': 'say hello hehe',

'hellohi': 'say hello hi',

'你好啊': 'say 你好啊',

'你好吗': 'say 你好吗',

'你好哈': 'say 你好哈',

}

for key in help_info:

cli.completer_kw_add(key, help_info[key])

while True:

line = cli.get_line()

if len(line) == 1 and ord(line[0]) == CLI_KEY_CTRLD:

break

if line == 'quit':

break

print(line)

if __name__ == "__main__":

test()

以上这篇使用python模拟命令行终端的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7 最小化安装工具包精简版本

安装工具包 yum install net-tools wget zip unzip vim-enhanced net-tools -y更新yum源 #先进入源的目录 cd /etc/yum.repo.d 或者/etc/yum.repos.d #备份一下官方源 mv CentOS-Base.repo CentOS-Base.repo.bak #将阿里源文件下载下来 wget -O /etc/yum.repos.d/CentOS-…

Data Lake Analytics-数据分析时代迎来新变革

前言 近期阿里云重磅推出新的数据分析引擎Data Lake Analytics&#xff0c;Data Lake Analytics是Serverless化的交互式联邦查询服务。无需ETL&#xff0c;使用标准SQL即可分析与集成对象存储(OSS)、数据库(PostgreSQL/MySQL/SQL Server等)、NoSQL(TableStore等)数据源的数据。…

这款耳机堪比千元级的AirPods

你如果问我&#xff1a;生活中你觉得必不可少的一件电子产品是什么&#xff1f;那么我会毫不犹豫的回答你&#xff1a;是耳机&#xff01;出门忘带耳机是绝对不能忍听不听没关系&#xff0c;但是有它比较安心我觉得生活中不仅是我很多人都对耳机有一种依赖因为很多人都喜欢音乐…

mysql blob 写入表_文件存入MYSql表的blob

向MYSql的数据表中存入文件&#xff0c;这看似没有什么大问题&#xff0c;只要把文件存入longblob字段就行了。但是最近的实践发现看似简单的背后其实有很多陷阱。下面就来分享一下我遇到的问题及我的解决办法。先介绍一下我的应用&#xff0c;只有两个页面upload.jsp和downloa…

java 发送邮件_Jenkins实现自动化邮件发送踩坑记录

文章简介本文分享Jenkins实现邮件发送&#xff0c;安装Jenkins可参考jenkins安装。写这篇文章&#xff0c;是在实际使用Jenkins过程中遇到这样一个问题&#xff0c;当每次Jenkins构建成功或者失败后&#xff0c;需要个人登录Jenkins查看构建结果&#xff0c;同时在构建前做了数…

Linux Shell脚本专栏_监控100台服务器磁盘利用率脚本_07

文章目录监控100台服务器磁盘利用率脚本1. 远程连接生成sshkey2. 复制ssh公钥到目标服务器3. 登录目标服务器查看4. 私钥免登录5. 192.168.43.134 服务器创建host,info文件6. 编辑脚本7. 赋予可执行权限8. 运行脚本9. 命令分解监控100台服务器磁盘利用率脚本 1. df -h 查看磁盘…

在linux下安装python3_【转】在Linux下安装python3

原文链接&#xff1a;http://www.cnblogs.com/feng18/p/5854912.html1、linux下安装python3a、 准备编译环境(环境如果不对的话&#xff0c;可能遇到各种问题&#xff0c;比如wget无法下载https链接的文件)2 下载 Python3.5代码包wget https://www.python.org/ftp/python/3.5.0…

【举栗子】Docker 容器磁盘占满的几种情况 | CSDN博文精选

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | isea533转自 &#xff5c; CSDN博客责编 | 阿秃参考文档&#xff1a;https://docs.docker.com/engine/reference/commandline/dockerd/应用日志过多默认情况下&#xff0c;每个 Docker 容器都有 10G 的存储空间&#xff0c;…

Linux Shell脚本专栏_批量检测网站是否异常脚本_08

文章目录1. 脚本制作2. 运行脚本3. 脚本进化动态参数传递4. 运行脚本5. 脚本分解1. 脚本制作 #!/bin/bash URL_LIST$ for URL in $URL_LIST; doFAIL_COUNT0for ((i1;i<3;i)); doHTTP_CODE$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)i…

下一代智能数据工厂,阿里云发布全新DataWorks

大数据的开发能力已经成为企业的核心竞争力之一, 企业对数据资产的管理、加工、利用的诉求也越来越强烈。 9月5日,阿里云发布了DataWorks V2版本, 可提升数据开发的效率并简化数据操作&#xff0c;为企业提供了安全可靠的一站式大数据智能云研发平台。 众所周知&#xff0c;企…

MaxCompute 项目空间内的访问控制和权限管理

项目空间内的访问控制分为以下五类&#xff1a; 用户管理ACL授权Policy授权角色管理基于标签的访问控制管理 用户管理 任意非项目空间Owner用户必须被加入MaxCompute项目空间中&#xff0c;并被授予相对应权限&#xff0c;方能操作MaxCompute中的数据、作业、资源及函数。示例…

mysql 中间点策略_网易MySQL中间件的负载均衡策略及性能优化

团队介绍网易乐得DBA组&#xff0c;负责网易乐得电商、网易邮箱、网易技术部数据库日常运维&#xff0c;负责数据库私有云平台的开发和维护&#xff0c;负责数据库及数据库中间件Cetus的开发和测试等等。一、背景随着业务的爆发式增长&#xff0c;电商系统中的读写压力越来越高…

华为与美国公司就授权5G平台展开初期谈判;Linux 中存在严重漏洞;Microsoft 发布 Cosmos DB GA 版……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周两次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go iPhone12 概念图&#xff08…

Bellman_Ford算法总结

知识概览 Bellman_Ford算法适合解决存在负权边的最短路问题&#xff0c;时间复杂度为O(nm)。在存在负权边的最短路问题中&#xff0c;Bellman_Ford算法的效率虽然不如SPFA算法&#xff0c;但是Bellman_Ford算法能解决SPFA算法不能解决的经过不超过k条边的最短路问题。 例题展示…

Linux Shell脚本专栏_批量主机远程执行命令脚本_08

文章目录1. 安装expect2. 脚本制作3. 赋予权限4. 运行脚本5. 直接运行脚本6. vmstat测试1. 安装expect [rootlocalhost ~]# yum install expect Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile* base: mirrors.aliyun.com* extras: mirrors.aliyu…

打破行业壁垒!阿里云OpenSearch开启个性化搜索里程碑

随着业务的高速发展&#xff0c;越来越多的客户对于搜索带来的实际转化和分发效率有了越来越高的要求。尤其在电商、资讯等行业&#xff0c;这一目标极其重要。 阿里云OpenSearch是面向全行业的搜索引擎解决方案&#xff0c;然而不同领域和业务场景的搜索需求复杂性导致当前单…

java collections_扫盲java.util.Collections工具包,学习排序、二分、洗牌、旋转算法

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 一、前言算法是数据结构的灵魂&#xff01;好的算法搭配上合适的数据结构&#xff0c;可以让代码功能大大的提升效率。当然&#xff0c;算法学习…

php获取mysql所有表_PHP获取MySQL数据库里所有表的实现代码

代码如下&#xff1a;function list_tables($database){$rs mysql_list_tables($database)&#xff1b;$tables array()&#xff1b;while ($row mysql_fetch_row($rs)) {$tables[] $row[0];}mysql_free_result($rs)&#xff1b;return $tables;}但由于mysql_list_tables方…

如何进行MaxCompute 用户认证?

您可以通过以下两种方式进行用户认证。 检查请求Request发送者的真实身份 即请求发送后&#xff0c;参数包括用户名和密码&#xff0c;服务端会验证用户名和密码是否正确&#xff0c;以此判断Request发送者的身份是否可信。 使用此方法有可能在请求时间较长的情况下&#xf…

Linux Shell脚本专栏_MySQL数据库备份_09

文章目录一、MySQL数据库备份单循环1. 安装mysql2. 配置mysql环境变量3. 刷新环境变量4. 创建数据库和表lue5. 脚本制作6. 运行脚本7. 查看备份的sql文件7. 脚本升级动态传参8. 运行脚本9. 查看备份的sql文件二、MySQL数据库表备份多循环2.1. 脚本制作2.2. 运行脚本2.3. 指定目…