可以对?显示帮助信息,需要立即获取输入的字符,因此需要用到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模拟命令行终端的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

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

  1. 动漫的python语言代码大全_使用Python来看看动漫中的你

    百度人工智能运用世界领先的对抗生成网络,结合人脸检测.头发分割.人像分割等技术,为用户量身定制千人千面的二次元动漫形象,并且可通过参数设置,生成戴口罩的二次元动漫人像. 先来一组图看看效果 八种口罩任 ...

  2. python语言指令大全_Python语言----linux常用命令(14)

    文件压缩解压:bzip2 压缩:bzip2 filename ---> 删除filename文件,生成 filename.bz2 解压缩:bzip2 -d filename.bz2 ---> ...

  3. linux命令行终端的翻屏滚屏,linux命令行终端的翻屏滚屏more/less/head/tail

    屏幕翻页快捷键 shift+PgUp    向前翻看,一般翻13页左右. shift+PgDown  向后翻看,一般翻13页左右. 我们翻阅目录和打开文件后,经常会由于输出内容太多,使一屏无法显示,所 ...

  4. 使用python做一个闹钟_用python做了个高级闹钟 欢迎借鉴

    原标题:用python做了个高级闹钟 欢迎借鉴 音频文件放入和.py文件同级的目录下 这是简单的闹钟做法,市场上闹钟千千万万,但是自己写出来的闹钟就是不一样,不是小编我无聊,学习乐趣就是这样慢慢培养的 ...

  5. linux下运行python_在Linux命令行终端中使用python的简单方法(推荐)

    Linux终端中的操作均是使用命令行来进行的.因此,对于小白来说,熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来. 打开命令行窗口 打开命令行窗口的快捷键如下: ...

  6. 在Linux命令行终端中写python代码的简单操作

    Linux终端中的操作均是使用命令行来进行的.因此,对于小白来说,熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来. 打开命令行窗口 打开命令行窗口的快捷键如下: ...

  7. python实现语音播放_用Python实现语音播报

    以下内容为带着儿子一起学Python的实现记录,为自己保存下来,也希望对其他学习者有用! 1. 确保已经安装python,本例使用python,操作系统为:Windows 10 专业版: 2. 设置环 ...

  8. python路径在哪里设置_找Python安装目录,设置环境路径以及在命令行运行python脚本实例...

    第一点:找Python安装目录 方法一: 方法二: 输入import sys print(sys.path) 化黑线处 第二点:找到安装目录后就可以开始设置环境变量 这里我的安装目录为C:\Progr ...

  9. python写网页插件_用python 实现activex网页控件

    首先,这个东东貌似只有windows上才能实现,所以,需要部署windows下的相关环境 1.需要安装python 2.安装python的win32com的lib,下载地址: 3.安装本地的web容器 ...

最新文章

  1. DDD+中台+微服务,yyds
  2. java map 结构体_业务代码的救星——Java 对象转换框架 MapStruct 妙用
  3. PAT甲级1073 Scientific Notation:[C++题解]字符串处理、科学计数法
  4. For each...in / For...in / For...of 的解释与例子
  5. (一)Builder(建造者)模式
  6. php 判断浏览器是ie,js判断是否是ie浏览器
  7. 计算机桌面上的输入法状态栏,输入法状态栏
  8. 全排列---STL方法与递归方法
  9. windows xp虚拟机安装教程
  10. 西方哲学包括计算机科学吗,哲学类专业包括哪些专业
  11. 相忘江湖不如相濡以沫(II)
  12. 【Spark NLP】第 16 章:对象字符识别(OCR)
  13. 模型量化论文阅读#4----EWGS:Network Quantization with Element-wise Gradient Scaling
  14. Windows 10 右键 在此处打开 CMD
  15. ueditor 图片上传 java_Spring+Vue整合UEditor富文本实现图片附件上传的方法
  16. java输出罗马数字_Java实现的求解经典罗马数字和阿拉伯数字相互转换问题示例...
  17. css inherit
  18. 短视频火爆全网也难逃一死
  19. CodeForces - 22A Second Order Statistics【水题】
  20. 穹顶灯打不出阴暗面_微服务的阴暗面,解释

热门文章

  1. 一种通用整形数组压缩方法
  2. OceanBase时序数据库CeresDB正式商用 为用户提供安全可靠的数据存储管理服务
  3. 网络架构优化--云企业网典型场景分析for客户
  4. Dubbo-gok8s注册中心设计方案与实现
  5. 【MySQL】时区设置引发的卡顿
  6. 美柚上云 致力成为最懂女人的互联网企业
  7. 阿里云高级技术专家张毅萍:我眼中的边缘计算
  8. 如何利用 Webshell 诊断 EDAS Serverless 应用
  9. 一份关于机器学习端到端学习指南
  10. 阿里云 MaxCompute 2018-09 新功能发布