计算机软件技术的不断发展,推动了人机交互技术的长足进步。从传统的命令行(Command Line Interface,CLI),到图形用户界面(Graphical User Interface,GUI),再发展到当前的自然用户界面(Natural User Interface,NUI)。界面技术使得用户与计算机之间的交互过程越来越简单,越来越便捷。

无论界面技术如何发展,命令行技术作为一种基于文本命令的模式,一直被广大软件开发人员所喜爱,这是由命令行技术的特点决定的[。一是命令行可以通过纯字符完成命令的输入,不需要频繁地使用鼠标等其它交互手段;二是在熟练记忆命令的前提下,命令行的效率是所有的交互手段中最高的,特别是对大量重复处理、批处理的时候,命令行优势明显。因此,无论图形界面技术如何发展,命令行均是主流软件考虑并保留的基本交互方式。

在天文数据处理领域,交互式数据语言(Interactive Data Language,IDL)、CASA(Common Astronomy Software Applications)等天文软件均提供了命令行接口。CASA软件在原有的AIPS、AIPS++基础上发展起来,目前已经是射电天文领域最为常用的数据处理软件 ,其操作完全需要通过命令行实现,在使用中不难发现仍有一些不方便之处,主要表现在:

(1)联机帮助功能不完备,不能分级提示。当用户不熟悉该软件时,联机帮助过程不详尽,不能获知命令参数的类型及格式,导致用户无法正确使用该命令。

(2)命令库没有进行有效分类。CASA命令复杂,数量庞大,在没有分类的情况下,在大量的命令中查找所需要的命令,对于操作人员非常困难。

从当前各类命令行界面的设计与特点来看,最为著名的是美国思科公司在其路由、交换机上实现的命令行界面,可以实现命令的联机帮助、自动命令补全、全程命令参数提示、严格的数据校验等。在其推出后,迅速成为全世界命令行交互软件的一个参考标准。国内外的后续产品都参考借鉴了思科公司(CISCO)的命令行风格。

本文借鉴思科公司命令行的设计思路[,在新一代中国太阳射电日像仪[(Chinese Solar Radio Heliograph,CSRH)数据处理系统的开发中,设计并实现了命令行界面系统-CSRHOS。该软件基于射电天文当前流行的Python语言,以太阳射电日像仪数据处理系统为应用背景,通过多个视图实现不同的命令分类,在交互过程中可以进行有效的权限控制,并可以实现命令的自动补全和联机帮助,使用者无需记忆复杂的命令即可快速地输入命令,取得了较好的应用效果。

1 系统设计

1.1 设计的需求分析

天文软件与其它计算机应用软件相比并没有很大的特殊性,但针对一个望远镜的观测与数据处理软件系统,软件的使用与交互仍有较明确的单一需求。包括:(1)交互命令要直观,输入的命令应尽可能简短;(2)对输入的数据必须有较强的检验,确保数据输入的合法性,避免影响最终的数据处理结果;(3)由于操作人员众多,尽可能不要让操作人员记忆太多的命令;(4)由于功能变化较大,要具有较好的可扩展性等;(5)系统的鲁棒性要好,用户输入错误不会导致系统异常或崩溃;(6)输入顺序的不同不应该影响数据的处理;(7)在输入命令时,为了避免命令歧义,要求命令关键字部分严格区分大小写,但用户输入的各类参数应具有较好的灵活性,比如可以不区分大小写,要适应人的自然等。为此,CSRHOS-CLI的设计与实现应该达到如下要求:

(1)为天文学家提供最为简单的交互方式。输入时,支持正常的光标移动,可以利用上下光标键翻转已经发过的命令,避免重复输入;输入一个命令时,只要输入的内容可以完整且唯一地表明一个命令,则不需要再输入下去,比如,如果命令是enable,当输入en后,如果没有其它命令以en开头,则en就可以唯一地表示enable,用这样的技术简化用户输入。

(2)支持自动补全。在用户输入一个命令的部分后,可以用Tab按键实现自动命令补全,比如用户输入en后,按Tab键,则屏幕应自动出现enable。

(3)在输入过程中,随时允许用户输入问号(?)实现联机帮助。用户在命令行提示符下,如果直接按?号,则应该列出所有的可用命令;如果用户输入了e,在后面再按?号,则应显示所有的以e开头的命令,用这样的方式,可以让用户即使没有看操作手册,也可以根据提示内容进行操作。

(4)在输入时要严格进行数据类型的匹配与校验,比如,如果要求用户输入一个观测时间,则应该判断用户输入的是不是HH∶MM∶SS格式,输入的内容必须是数字,不能是字符,输入的范围要合理,HH必须在00-23之间,MM必须在00-59之间。同时,也必须满足人们的使用习惯,上午8∶30分,则可以输入8∶30∶0,这也是正确的格式。

(5)能够提供不同的视图,将不同类型的命令分布在不同的视图下,以帮助用户快速地找到命令,避免大量的命令在一起不容易查找。比如针对星表计算的命令均放在一个视图下,把数据处理的均放在另一个视图等,就可以达到很好的命令分类效果。

(6)在输入命令时要严格区分命令关键字部分大小写,而参数部分不需要区分大小写。例如,在计算某星体在某一时刻的视位置信息,命令“planet 2012-11-22 0∶0∶0 sun”计算太阳在2012-11-22零点的视位置,其中planet为命令关键字,sun为其中的一个参数,用户如果输入命令“PLANET 2012-11-22 0∶0∶0 sun”则错误,用户如果输入命令“planet 2012-11-22 0∶0∶0 Sun”是正确的。

(7)采用Python语言开发完成,这是考虑到当前在射电天文领域,Python语言正在成为最主流的语言,SunPy等大量的基础支撑包的出现给Python在天文软件中的开发带来了有力的支撑。

1.2 系统构架

根据上述需求,CSRHOS-CLI的系统架构设计如图 1,命令行系统主要分为4大部分,分别是:命令输入与联机帮助,命令解析、校验与执行,权限与视图控制,模块载入。(1)命令输入与联机帮助:通过在Unix/Linux平台下的Readline[实现用户命令输入,提供Tab键自动补全和问号(?)联机帮助功能。CSRHOS-CLI命令繁多,为用户提供自动补全和联机帮助功能,可以使用户快速输入命令,即使不熟悉本系统,也能根据帮助内容进行操作。(2)命令解析、校验与执行:对用户输入命令进行匹配、补全,实现参数的有效性检验,调用相关函数并执行。(3)权限与视图控制:实现权限设置和视图控制,分类管理各权限、视图下的命令,有效地加速命令的匹配与执行。(4)模块载入:调用其他模块。

图 1 CSRHOS-CLI系统构架

Fig. 1 The architecture of the CSRHOS-CLI

1.3 系统流程

根据CSRHOS-CLI 需求分析及总体架构设计,系统数据流程如图 2。

图 2 CSRHOS-CLI数据流程图

Fig. 2 The flowchart of the CSRHOS-CLI

2 关键技术与实现

2.1 参数数据类型定义与校验

命令行交互方式中,用户会输入命令关键字与参数,这两部分均需要进行严格的判断。为了满足天文数据处理的需求,考虑到交互中需要输入的数据类型,CSRHOS-CLI定义了一系列的天文数据类型并给出相应的校验正则表达式。下面以TIME类型为例,说明数据类型校验。在天文数据处理领域,TIME分为时、分、秒3部分,根据用户习惯的时间可以写成如下情况:时(0-9、00-19或20-23)、分(0-9或00-59)、秒(整数部分:0-9或00-59,小数部分:只能为数字或没有),得出正则表达式如下:

regexp=r"((([0-9])|([0-1][0-9])|([2][0-3])):(([0-9])|([0-5][0-9])):(([0-9])|([0-5][0-9])) (\\.\\d+)?)"

CSRHOS-CLI中定义的数据类型几乎可以涵盖天文数据处理的所有数据类型,同时也对每个数据类型使用了正则表达式进行校验,在用户命令输入时即可检验输入参数是否正确。根据天文数据处理需求,CSRHOS-CLI定义的部分相关数据类型及其描述如表 1。

2.2 权限与视图控制

考虑到软件使用者范围的广泛性,为提高系统安全性,避免任何用户都能修改系统配置,系统为不同用户提供不同权限;为满足命令的快速匹配,提高查找效率,提供多种视图分别管理不同类型命令,系统设置了权限与视图控制。

目前实现了3种基础权限和4种视图。3种权限包括普通用户权限(NONE);特殊用户权限,允许使用特殊命令(ENABLE);管理员权限,允许修改系统配置(CONFIG)。4种视图分别是公有命令视图(COMMON)、普通用户视图(NORMAL)、特殊命令视图(ENABLED)、系统配置命令视图(CONFIGUTRE)。此外可以根据需要随时进行功能视图的扩展,比如针对太阳射电日像仪数据处理要求,将所有的星表功能集成在一个视图中,建立EPHEMERIS视图。基于这些权限与视图,极大地增强了系统的安全性并方便用户对命令的管理。

表 1 数据类型

Table 1 Data types

类型描述

STRING字符串

BOOL布尔型,取值“true”、“false”、“1”、“0”

STATE状态,取值“on”、“off”、“down”、“up”

INT整型

FLOAT浮点型

HEXNUMBER十六进制

DATE日期,格式YYYY-MM-DD,YYYY代表年份必须为四位数字,MM代表月份(1-9或01-12),DD代表日期(1-9或01-31)

TIME时间,格式HH∶MM∶SS.SSSS,HH代表时(0-24或00-24),MM代表分(0-59或00-59),SS代表秒整数部分(0-59或00-59),SSSS代表秒小数部分(可有可无)

PLANET太阳系星体名,可取值“sun”、“moon”、“mars”等(不区分大小写)

RA赤经,格式HH∶MM∶SS.SSSS,HH代表时(0-24或00-24),MM代表分(0-59或00-59),SS代表秒整数部分(0-59或00-59),SSSS代表秒小数部分(可有可无)

DEC赤纬,格式DD∶MM∶SS.SSSS,DD代表度(0-89或00-89),MM代表分(0-59或00-59),SS代表秒整数部分(0-59或00-59),SSSS代表秒小数部分(可有可无),可取正负

2.3 联机帮助

CSRHOS-CLI较之CASA,主要优点之一是实现了强大的命令分级联机帮助,用户在任何地方输入问号(?)即可获得联机帮助。为了方便用户在不熟悉系统的情况下也能操作,用户可以在输入的命令中任何位置通过问号获取无论是命令关键字还是参数的详细作用与格式。系统使用Python内置函数get_function_help()获取命令的帮助文档,该文档即为函数定义时,对函数功能、参数类型及格式的描述,用户命令通过Readline函数库输入,判断输入字符为“?”,则进入联机帮助流程,此时“?”所处的位置有4种情况:“?”、“命令?”、“参数?”、“命令命令?”,实现联机帮助详细流程如表 2(帮助流程所提到的命令树见图 3)。

表 2 联机帮助流程

Table 2 The flow of the online help function

1、判断用户输入命令长度为1(即输入的命令为“?”)

1.1、遍历当前权限视图下的子命令树,返回每个叶子节点

1.2、循环调用Python内置函数get_function_help(),得到叶子节点所指向函数的帮助文档并输出

2、判断用户输入命令长度不为1

2.1、将用户输入的命令按空格分隔为n个字符串,遍历当前权限视图下的子命令树,得到与用户命令前n-1个字符串匹配或参数校验合法的分支

2.2、判断用户命令第n个字符串,若为“?”,则遍历得到的分支下所有叶子节点,得到叶子节点所指向的命令函数,获取问号指代关键字或参数的帮助文档并输出

2.3、判断用户命令第n个字符串,若为“命令?”,则遍历得到的分支下的所有与?前命令匹配的子节点,得到叶子节点所指向的命令函数,获取问号指代关键字或参数的帮助文档并输出

图 3 命令树

Fig. 3 The command tree of the CSRHOS-CLI

2.4 功能定义与扩展

为了方便CSRHOS-CLI进行功能扩展,并快速集成新的功能,CSRHOS-CLI在初始化过程中,利用Python内置函数Globals()获取指定目录下(安装目录下的/script/lib)所有对象和函数,通过匹配函数前缀“ccli_”生成命令函数集_functions,并初始化命令函数所在权限和视图信息字典_functions_access,通过权限视图信息,建立一棵全局命令树结构,命令树以各视图及视图下命令的元素(关键字与参数)为下层节点,即可得到各权限视图下的命令树(全局命令树的子树)。图 3给出一个命令树的示意图,从中不难看出,所有的命令拆分成命令关键字与参数两大部分(在命令树上关键字部分为小写,参数部分为大写),并按所在的视图分别挂在全局命令树各节点上。从图上可以看到,有3个视图(NORMAL、CONFIGURE、EPHEMERIS),其中CONFIGURE视图下有两个命令(observatory longitude FLOAT和observatory latitude FLOAT),EPHEMERIS视图下有一个命令(sun DATE TIME)。在命令匹配时,根据该命令树进行命令查找,这样的实现方式,可以快速地判断当前命令的输入情况,进行命令补全和联机帮助。

2.5 命令解析、校验与执行

命令行交互式中,系统接收的命令由用户输入,不能完全保证用户输入即符合命令格式,在执行之前,需要对命令进行规范、补全,检验参数的有效性。命令的匹配、参数校验及执行流程如图 4。在用户按下回车键后,系统进入命令匹配、参数检验流程。

图 4 命令匹配、执行流程图

Fig. 4 The flowchart of command matching and execution in the CSRHOS-CLI

3 模块编程示例

CSRHOS-CLI是一个命令行框架,事实上可以应用于所有的软件开发,提供命令行交互接口。对具体的软件开发人员来说,可以将开发完成的各个模块挂接在命令行框架下,实现基于命令行的命令调用。下面以中国太阳射电日像仪软件开发中的一个功能举例,说明如何在CSRHOS-CLI下进行挂载。在太阳射电日像仪数据处理中,用户需要计算太阳在一个观测时刻的视位置,为实现此功能,定义命令为:

sun DATE TIME

其中 “sun” 是关键字,“DATE” 和 “TIME” 表示需要输入日期参数与时间参数,格式如表 1定义。根据在第2节讨论的相关内容,具体编程如下:(1)在安装路径下的/script/lib目录建立命令接口文件;(2)根据命令函数的定义格式进行函数具体实现;(3)定义该命令所在的权限与视图。具体实现代码的主要部分如图 5。

代码定义了ENABLE权限、EPHEMERIS视图下的命令sun DATE TIME,根据命令函数格式,函数名为ccli_sun_DATE_TIME,其中第4行通过set_privilege()定义了该命令在ENABLE权限、EPHEMERIS视图下,6-11行为函数具体实现过程,其中7-10行为该命令注释部分,注释部分作为分级联机帮助文档即第7行对命令关键字sun解释,第8行对参数DATE解释,第9行对参数TIME解释,第11行即为命令具体实现部分(具体的星表计算部分略)。

图 5 模块代码示意图

Fig. 5 Illustration of modularized coding with the CSRHOS-CLI

4 CSRHOS-CLI运行效果

CSRHOS-CLI系统已经在太阳射电日像仪数据处理软件中应用,同时也是一个通用的命令行框架,可以在其它天文软件中集成应用。软件的启动界面如图 6。

图 6 启动界面

Fig. 6 The splash screen of the CSRHOS-CLI

图 7展示了联机帮助和命令扩展效果:(1)在输入不完整的命令“su”后,输入问号,系统自动匹配到唯一以“su”开头的命令,并将其功能输出;(2)在输入不完整命令“su”,空格后输入问号,系统自动匹配到唯一以“su”开头的命令,获取该命令第2个字段详细作用及其格式并输出,实现了分级帮助;(3)在输入“su 2013-12-23 0∶0∶0”,并按下回车键,系统匹配到唯一以“su”开头的命令“sun”,校验其参数,并执行。

图 7 联机帮助及扩展命令执行效果

Fig. 7 A display of effects of online help and execution of extensions of input commands

CSRHOS-CLI系统鲁棒性强,当用户输入错误的命令关键字或非法参数,系统均能识别。如图 8,将TIME参数输为30∶0∶0,或将命令关键字输为sum,或将DATE参数输为2012-22-4,或将命令关键字部分大小写错误,系统通过参数校验检测到非法参数、命令匹配找不到命令,最后返回用户命令非法。

图 8 非法命令调用示意图

Fig. 8 A display of effects of execution of illegal commands

5 结 论

本文针对中国太阳射电日像仪观测与数据处理系统用户界面设计和使用交互的需求,设计并实现了一套基于Python的CSRHOS-CLI命令行交互式框架,框架实现了天文数据的数据类型定义与有效性校验;系统利用Readline库的强大功能,实现了左右方向键移动允许字符插入,上下方向键滚动历史命令,自动将输入的命令行写入历史命令文件,Tab键的自动补全等诸多功能,大大加速了命令的输入,并提供了问号联机帮助功能,帮助用户快速地了解命令的作用及使用方法;该系统通过权限与视图的分类,提高了系统的安全性,极大地方便了命令的管理与使用,加大了命令的匹配及其执行速度;同时,用户可以根据不同的需求进行命令扩展,并设置命令所在的权限与视图。目前,CSRHOS-CLI已经应用于太阳射电日像仪数据处理软件中,取得了良好的应用效果,获得了使用人员的一致认可。

CSRHOS-CLI的实现,不仅对天文领域各天文数据处理交互软件的开发与设计提供了良好的借鉴和参考价值,同时也为广大命令行交互系统软件开发人员提供了非常好的架构参考,极大地方便了用户与系统的交互,该系统采用开源的方式发布,可以供技术人员在开发其它软件时集成使用。

python怎样使用各个日期赤纬_基于Python的天文软件命令行界面设计与实现相关推荐

  1. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  2. python版植物大战僵尸源码_基于python的植物大战僵尸游戏设计与实现.docx

    湖南理工学院毕业设计(论文) PAGE PAGE 1 学 号 毕业设计(论文) 题目:基于python的植物大战僵尸游戏设计与实现 作 者 届 别 届 院 别 信息与通信工程学院 专 业 信息工程 指 ...

  3. 基于python的股票程序化交易论文_基于Python工具的股票量化投资策略研究

    2019 年第 07 期 20 世 纪 80 年代, 一 些 投 资 者 开 始 利用 计 算 机 研究金 融 数据 , 并 初显 成 效 . 20 世 纪 末 , 投 资 者 把 计 算 机 技术 ...

  4. 用python写脚本筛选原创微博_基于python编写的微博应用

    本文实例讲述了基于python编写的微博应用,分享给大家供大家参考.具体如下: 在编写自己的微博应用之前,先要到weibo开放平台申请应用的公钥和私钥. 下载python版的SDK,打开example ...

  5. python中sample是什么意思_基于Python中random.sample()的替代方案

    python中random.sample()方法可以随机地从指定列表中提取出N个不同的元素,但在实践中发现,当N的值比较大的时候,该方法执行速度很慢,如: numpy random模块中的choice ...

  6. python flask实现博客系统_基于Flask的博客网站设计与实现

    涂远杰 郑剑 摘要:该博客系统是一款分享型博客,注重个人的学习心得.生活等方面的记录.后台基于Python中的Flask框架开发,还涉及爬虫,数据库使用的是轻型的SQLite,同时,前端页面的实现涉及 ...

  7. python扫雷的代码及原理_基于Python实现的扫雷游戏实例代码

    摘要:这篇Python开发技术栏目下的"基于Python实现的扫雷游戏实例代码",介绍的技术点是"Python实现.Python.实例代码.扫雷游戏.扫雷.游戏" ...

  8. python的图书管理项目教程_基于python图书馆管理系统设计实例详解

    写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉! 这个项目不是我的作业, 只是无意中被拉进来了,然后就承担 ...

  9. 基于python的智能安防系统_基于Python语言的智能家居系统研究

    龙源期刊网 http://www.qikan.com.cn 基于 Python 语言的智能家居系统研究 作者:张微微

最新文章

  1. android连接不上socket,关于socket通信的android与pc端连接,为什么我定义的socket是为空的,连接不上pc端...
  2. jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查
  3. UVA - 11478 Halum 二分+差分约束
  4. 剑指offer:分行从上往下打印二叉树
  5. CodeForces - 1334C Circle of Monsters(贪心)
  6. c#ovalshape_【原创】C# 实现拖拉控件改变位置与大小(SamWang)(附源代码下载)
  7. 【Java】欧拉回路的判定
  8. Python使用pandas合并多个Excel文件
  9. 剑指offer面试题39. 数组中出现次数超过一半的数字(数组)(摩尔投票法)
  10. 导致页面顶部空白一行解决方法
  11. 系统学习机器学习之SVM(二)
  12. 第十二课:实验二 循环链表实验
  13. 14.深入分布式缓存:从原理到实践 --- 典型电商应用与缓存
  14. 云服务器预装什么系统好,云服务器预装什么系统好
  15. 专业pdf转word转换软件 pdf转换器 pdf转txt pdf转ppt、excel
  16. MODIS计算NDVI注意事项_江仔91_新浪博客
  17. 内核查找符号指针函数kallsyms_lookup_name
  18. 坑爹的No matching method
  19. python精通能赚钱吗_月入3千到月入10万,精通数据分析的人到底有多赚?
  20. 城市感知体系十大典型应用场景

热门文章

  1. 12. 自制操作系统: risc-v ACLINT
  2. [旅游]300元走遍上海周边最美的古镇
  3. windows10利用docker安装splash
  4. vue router连续点击多次路由报错
  5. 安超云生态|携手中电福富 打造党政协同一体化云办公解决方案
  6. 遇到VerifyError束手无策?
  7. Xilinx 7系列原语使用(时钟相关)——(一)
  8. 动态链接--打桩机制
  9. 用Python登陆新版正方教务系统获取课程表(及RSA加密密码实现)
  10. 【开源推荐】XMM Go语言环境中完全自主实现的第三方内存管理库