Loading... # 引言 越来越喜欢CLI了,假设一个场景昂,如果你要运行一个程序,直接双击打开对吧,但是一些命令,双击可能什么效果也没有,比如nginx,双击是打开,但是没有窗口,结束进程来关闭?重启nginx呢?实际上nginx的开发者早就想好了策略。以下以nginx为例。 # 比如 当我们在cmd或者shell中输入nginx,是这样的(前提是安装好了,并且OS能够找到)。 ![image.png](https://www.zunmx.top/usr/uploads/2021/08/3072619526.png) 此时此刻,我们已经运行了nginx,但是,我们关闭的话,可以通过`taskkill 、 pkill` 直接进行关闭,但是这并不是正常关闭,此时需要通过命令-s 来下达指令,不妨我们使用 -h来看看命令的说明。 ![image.png](https://www.zunmx.top/usr/uploads/2021/08/3435861673.png) `-s stop` 将会发送关闭主进程信号,此时执行`nginx -s stop`将会停止nginx服务。 # 正文 在Python中,获取参数的方法和Java、C不同,他们都在主入口方法\函数中,但是看到`argv` 我们也可以猜到,和传入参数有关。 1. 导入sys模块 2. 获取参数 3. 分析参数 4. 根据参数执行不同命令 见以下代码: ```python import sys if __name__ == "__main__": argv = sys.argv if "-h" in argv or "-help" in argv: print("THIS IS HELP DOCUMENT.") if "-s" in argv: print("-s command and value is %s" % argv[argv.index("-s") + 1]) ``` 当我们传入参数为`-h`或`-help`时,将会输出`THIS IS HELP DOCUMENT.`, 这里很容易理解的对吧。 ![image.png](https://www.zunmx.top/usr/uploads/2021/08/2725192862.png) 但是如果我们也要实现类似于`nginx -s reload`呢? 可以通过下面的方法,判断`-s`是否存在,并且取到`-s`后面紧跟着的数据。 ![image.png](https://www.zunmx.top/usr/uploads/2021/08/192720392.png) 但是如果使用者不规范使用呢?比如之传入了`-s` 后面什么也没写呢?就会发生如下异常。 ![image.png](https://www.zunmx.top/usr/uploads/2021/08/58517955.png) 为了避免使用者不规范问题,我们可以判断一下是否存在,或者是try一下,并且提示如何使用的。 ![image.png](https://www.zunmx.top/usr/uploads/2021/08/1651363075.png) 为了抽取公共方法,我们来把获取指定参数的值封装一下。详见注释。 ```python import sys def getArgvValue(argv, key): length = len(argv) if key in argv: index = argv.index(key) if index + 1 >= length: print("command is illegal!") # 后面什么也没有了,冒然去获取可能会超出范围 return "" else: value = argv[argv.index("-s") + 1] # 获取后面的参数 if value.startswith("-"): # 后面如果应该有参数,但是参数不能是-开头的,如果是,那就没有值 print("value is empty") return "" return value else: return "" if __name__ == "__main__": argv = sys.argv if "-h" in argv or "-help" in argv: print("THIS IS HELP DOCUMENT.") if "-s" in argv: try: print("-s command and value is %s" % getArgvValue(argv, "-s")) except IndexError: print("command is illegal! -s reload/stop/exit") ``` 通过这种方法进行封装的,参数格式是这样的 ```bash demo -功能1 -功能2 -参数1 值1 -参数2 值2 ``` 也就是说键需要以`-`开头,值直接是值。这样的也是最常见的。 如果出现两次`-s`的话,只会获取到第一次的,当然出现两次是不符合常理的。为了避免歧义,再次进行优化。 ```python import sys def getArgvValue(argv, key): if argv.count(key) != 1: print("Duplicate data exists in the command") return "" length = len(argv) if key in argv: index = argv.index(key) if index + 1 >= length: print("command is illegal!") # 后面什么也没有了,冒然去获取可能会超出范围 return "" else: value = argv[argv.index("-s") + 1] # 获取后面的参数 if value.startswith("-"): # 后面如果应该有参数,但是参数不能是-开头的,如果是,那就没有值 print("value is empty") return "" return value else: return "" ``` # 效果图 ![k-v](https://www.zunmx.top/usr/uploads/2021/08/1134391403.png) ![k-non V](https://www.zunmx.top/usr/uploads/2021/08/849016014.png) ![k-non V k](https://www.zunmx.top/usr/uploads/2021/08/3208090521.png) ![dup键](https://www.zunmx.top/usr/uploads/2021/08/773509293.png) ![dup键2.png](https://www.zunmx.top/usr/uploads/2021/08/3616428458.png) © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏