引言
越来越喜欢CLI了,假设一个场景昂,如果你要运行一个程序,直接双击打开对吧,但是一些命令,双击可能什么效果也没有,比如nginx,双击是打开,但是没有窗口,结束进程来关闭?重启nginx呢?实际上nginx的开发者早就想好了策略。以下以nginx为例。
比如
当我们在cmd或者shell中输入nginx,是这样的(前提是安装好了,并且OS能够找到)。

此时此刻,我们已经运行了nginx,但是,我们关闭的话,可以通过taskkill 、 pkill 直接进行关闭,但是这并不是正常关闭,此时需要通过命令-s 来下达指令,不妨我们使用 -h来看看命令的说明。

-s stop 将会发送关闭主进程信号,此时执行nginx -s stop将会停止nginx服务。
正文
在Python中,获取参数的方法和Java、C不同,他们都在主入口方法\函数中,但是看到argv 我们也可以猜到,和传入参数有关。
- 导入sys模块
- 获取参数
- 分析参数
- 根据参数执行不同命令
见以下代码:
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., 这里很容易理解的对吧。

但是如果我们也要实现类似于nginx -s reload呢? 可以通过下面的方法,判断-s是否存在,并且取到-s后面紧跟着的数据。

但是如果使用者不规范使用呢?比如之传入了-s 后面什么也没写呢?就会发生如下异常。

为了避免使用者不规范问题,我们可以判断一下是否存在,或者是try一下,并且提示如何使用的。

为了抽取公共方法,我们来把获取指定参数的值封装一下。详见注释。
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")
通过这种方法进行封装的,参数格式是这样的
demo -功能1 -功能2 -参数1 值1 -参数2 值2
也就是说键需要以-开头,值直接是值。这样的也是最常见的。
如果出现两次-s的话,只会获取到第一次的,当然出现两次是不符合常理的。为了避免歧义,再次进行优化。
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 ""
效果图







评论 0
还没有评论,来说点什么吧。