2.1 与命令行相关的Python语言特性

2.1.1 使用sys.argv获取命令行参数

Python中的sys.argv[]是一个从程序外部获取参数的桥梁,可以获取外界调用该命令时的命令行,包括全部的参数。例如:

#!/usr/bin/python3
import sys

args = sys.argv[0:]
print(args)

在Linux中保存文件,并加上执行权限:

chmod +x 01-argv.py

执行结果如下:

root@liu-ubuntu:~# ./01-argv.py aaa bb c
['./01-argv.py', 'aaa', 'bb', 'c']

命令行的每个部分被argv传递给程序内部,包括命令本身以及参数。
如果在Windows系统中调用时,要用Python执行py文件:

python 01-argv.py aaa bb c

结果为:

['01-argv.py', 'aaa', 'bb', 'c']

后面课程中,除非特殊提示,所有代码均在Linux系统下运行。

2.1.2 使用sys.stdin和sys.stdout进行标准输入输出

在需要更好的控制输出时,sys.stdout,sys.stdin可以实现。

>>> import sys
>>> sys.stdout.write('hello')
hello5

sys.stdin.readline()会将标准输入全部获取,包括末尾的'\n',因此用len计算长度时是把换行符'\n'算进去了的,但是input()获取输入时返回的结果是不包含末尾的换行符'\n'的。因此如果在平时使用sys.stdin.readline()获取输入的话,不要忘了去掉末尾的换行符,可以用strip()函数sys.stdin.readline().strip('\n')或sys.stdin.readline()[:-1]这两种方法去掉换行。
例如:

#!/usr/bin/python3
import sys

temp = sys.stdin.readline().strip('\n')
if temp:
    sys.stdout.write(temp)
    sys.stdout.write('====')

结果为:

root@liu-ubuntu:~# ./02-stdinout.py 
test
test====root@liu-ubuntu:~#

2.1.3 使用SystemExit异常打印错误信息

sys.exit()始终会抛出一个SystemExit异常。在使用sys.exit()退出程序时,要对这个异常进行处理,可以做一些清理工作。
例如:

#!/usr/bin/python3
import sys
try:
    temp = sys.stdin.readline().strip('\n')
    if temp:
        sys.stdout.write(temp)
        sys.stdout.write('====')
    else:
        sys.exit()
except SystemExit:
    print('In except')

在读取输入的时候,直接按回车,则结果如下:

root@liu-ubuntu:~# ./03-sysexit.py 

In except
root@liu-ubuntu:~#

2.1.4 使用getpass库读取密码

Python中getpass的作用是输入密码不可见。
例如:

#!/usr/bin/python3
import getpass

name = input('Input name:')
passwd = getpass.getpass('Input password:')

print(name)
print(passwd)

运行结果如下:

root@liu-ubuntu:~# ./04-getpass.py 
Input name:liu
Input password:
liu
123456
root@liu-ubuntu:~#

注意输入密码时,光标不会向后移动。