Python程序读取命令行参数(sys和getopt)


一、一层难度

这里我们只需要获取控制台输入的字符串是啥,直接抄过来。

1.sys 模块

import sys
  • 访问到所有的命令行参数:
    • python xxx.pyxxx.py及其之后的才是,之前的不是。
    • 要编译的.py文件就是第一个参数
  • 它的返回值sys.argv列表(list)类型
    • 参数个数: len(sys.argv)
    • 访问列表元素:sys.argv[i]
      • 从0开始,第一个sys.argv[0]就是.py文件。
      • 都是字符串类型。
  • 参数
    • 以空格分离
    • 可以被''包含着输入空格
    • 转移字符\传入后多带一个\

2.例子

(1)基本特性

import sys

print(sys.argv)
print(type(sys.argv))
print(sys.argv[0])

在这里插入图片描述

(2)都是str类型

import sys

print(sys.argv)
print(sys.argv[1])
print(type(sys.argv[1]))

在这里插入图片描述

(3)xxx.py及其之后的才是

import sys

print(sys.argv)

在这里插入图片描述

  • 第一个-u不是,因为它是传给编译器的参数,只有xxx.py及其之后的才是
  • 第二个-u是,可以看到被读取到了。

(4)空格和转移字符

import sys

print(sys.argv)

在这里插入图片描述

  • 以空格分离
  • 可以被''包含着输入空格
  • 转移字符\传入后多带一个\

二、二层难度

在sys模块的基础上,我们不仅要获取命令行参数,还要将每个参数和对应的变量关联起来。

比如:输入用户名username和密码password

  • 用sys是python xxx.py 3 4,我们还得自己还得保证3对应用户名username和4对应密码password。
  • 而用getopt是python xxx.py -u 3 -p 4python xxx.py -p 4 -u 3,这样就不怕对应不上了。

1.getopt模块

# 需要用sys.argv[1:]参数
import sys
import getopt

(1)思想

getopt怎么解析参数的?

  • 我们知道-u3对应、-p4对应,这种形式很像键值对,那么我们就可以用一个元组将其分别存储起来,然后将这些元组整合在一起成为一个列表
  • 同时,有的命令参数不需要对应的值,比如常见的-h表示需要帮助。我们也用元组储存,对应的值为空就行
  • 解析键值对的时候,是顺序解析的,碰到解析错误时后面就不解析全归入错误的第二个返回值args中了。比如要-h -u 3 -p 4,却输入错误的-h 3 -u -p 4
    在这里插入图片描述

(2)函数

原型:

getopt.getopt(args, options[, long_options])

例子:

opts, args = getopt.getopt(sys.argv[1:], "hu:p:",
                               ["help", "username=", "password="])
# 三种参数,help(h),username(u),password(p)。第一个不需要值,另外两个需要值
  • args:表示要解析的命令行参数,为sys.argv[1:]
    因为要解析的是键值对的参数,而sys.argv[0]表示文件xxx.py,不对应键值对。
    注意:当传入文件名(即sys.argv)是会解析错误的,你会发现后面的参数匹配不上。
  • options:-u这种带个-的形式,表示短格式分析串。
    • 用字符串""
    • 一个字母即表示一种参数(键值对的键)
    • 字母后跟:表示需要值,不跟表示不需要值。
  • long_options:--usename这种带个--的形式,表示长格式分析串。
    • 用列表[]
    • 一个单词即表示一种参数(键值对的键)
    • 单词后跟=表示需要值,不跟表示不需要值。
  • 返回值:
    • 第一个返回的是元组的列表,表示成功对应的参数
    • 第二个返回的是列表,表示对应失败无法解析的参数

2.例子

(1)简单

# 需要用sys.argv[1:]参数
import sys
import getopt

print(sys.argv)

try:
	# 三种参数,help(h),username(u),password(p)。第一个不需要值,另外两个需要值
    opts, args = getopt.getopt(sys.argv[1:], "hu:p:",
                               ["help", "username=", "password="])
	# 元组的列表,表示成功对应的参数
    print('[opts]', opts)
    # 列表,表示对应失败无法解析的参数
    print('[args]', args)
# 报错是getopt.GetoptError
except getopt.GetoptError:
    print('[getopt.GetoptError]')
    sys.exit()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输入的时候:

  • 短:-u 3-u3
  • 长:--username 3--username=3

(2)提取元组

就是处理每个元组

import sys
import getopt

print(sys.argv)

try:
    opts, args = getopt.getopt(sys.argv[1:], "hu:p:",
                               ["help", "username=", "password="])

    username = ""
    password = ""
    # 就是处理每个元组
    for k, v in opts:
        if k in ("-h", "--help"):
            print('[-h --help]')
        elif k in ("-u", "--username"):
            username = v
            print('[-u --username]', username)
        elif k in ("-p", "--password"):
            password = v
            print('[-p --password]', password)
    print('[username]', username)
    print('[password]', password)
except getopt.GetoptError:
    print('[getopt.GetoptError]')
    sys.exit()

在这里插入图片描述

三、帮助文档格式

Code Style: how to write command parameters help document

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值