python 运行参数解析

引言

越来越喜欢CLI了,假设一个场景昂,如果你要运行一个程序,直接双击打开对吧,但是一些命令,双击可能什么效果也没有,比如nginx,双击是打开,但是没有窗口,结束进程来关闭?重启nginx呢?实际上nginx的开发者早就想好了策略。以下以nginx为例。

比如

当我们在cmd或者shell中输入nginx,是这样的(前提是安装好了,并且OS能够找到)。
image.png
此时此刻,我们已经运行了nginx,但是,我们关闭的话,可以通过taskkill 、 pkill 直接进行关闭,但是这并不是正常关闭,此时需要通过命令-s 来下达指令,不妨我们使用 -h来看看命令的说明。

image.png

-s stop 将会发送关闭主进程信号,此时执行nginx -s stop将会停止nginx服务。

正文

在Python中,获取参数的方法和Java、C不同,他们都在主入口方法\函数中,但是看到argv 我们也可以猜到,和传入参数有关。

  1. 导入sys模块
  2. 获取参数
  3. 分析参数
  4. 根据参数执行不同命令

见以下代码:

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

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

image.png

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

image.png

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

image.png

为了抽取公共方法,我们来把获取指定参数的值封装一下。详见注释。

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 ""

效果图

k-v
k-non V
k-non V k
dup键
dup键2.png

评论 0

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

提交后需要审核才会公开。