Python常用命令行工具


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

sys.argv就是一个保存命令行参数的普通列表

示例:

#!/usr/bin/python3 # -*-coding:UTF-8-*-

import os import sys def main(): sys.argv.append("") filename = sys.argv[1]  # 如果用户直接运行程序,没有传递任何命令行参数,那么访问sys.argv[1]将会出现索引越界的错误,为了避免这个错误,在访问sys.argv之前先向sys.argv中添加一个空的字符串
    if not os.path.isfile(filename):    # 判断文件是否存在
        raise SystemExit(filename + ' does not exists') elif not os.access(filename, os.R_OK):  # 如果文件存在,则使用os.access函数判断是否具有对文件的读权限
        raise SystemExit(filename + ' is not accessible') else: print(filename + ' is accessible') if __name__ == '__main__': main()

2、使用sys.stdin和fileinput读取标准输入

(1)sys.stdin

示例:

#!/usr/bin/python3 # -*-coding:UTF-8-*-

import sys for line in sys.stdin: print(line, end="") 或者 def get_content(): return sys.stdin.readlines() print(get_content())

执行:

python3 xxx.py < /etc/passwd

cat /etc/passwd | python3 xxx.py

(2)fileinput

fileinput读取内容比sys.stdin更加灵活,fileinput既可以从标准输入中读取数据,也可以从文件中读取数据

示例:

#!/usr/bin/python3 # -*-coding:UTF-8-*-

import fileinput for line in fileinput.input(): print(line, end="")

执行:

python3 xxx.py < /etc/passwd

cat /etc/passwd | python3 xxx.py

python3 xxx.py /etc/passwd /etc/hosts

因为fileinput可以读多个文件内容,所以,fileinput提供了一些方法可以知道当前所读的内容属于哪一个文件。fileinput中常用的方法有:

filename:当前正在读取的文件名
fileno:文件的描述符
filelineno:正在读取的行是当前文件的第几行
isfirstline:正在读取的行是否当前文件的第一行
isstdin:正在读取文件还是直接从标准输入读取内容

示例:

#!/usr/bin/python3 # -*-coding:UTF-8-*-

import fileinput for line in fileinput.input(): meta = [fileinput.filename(), fileinput.fileno(), fileinput.filelineno(), fileinput.isfirstline(), fileinput.isstdin()] print(*meta, end="") print(line, end="")

3、使用SystemExit异常打印错误信

文件描述符 用途 POSIX名称 stdio流
0 标准输入 STDIN_FILENO stdin
1 标准输出 STDOUT_FILENO stdout
2 标准错误 STDERR_FILENO stderr

示例:

#!/usr/bin/python3 # -*-coding:UTF-8-*-

import sys sys.stdout.write('hello') sys.stderr.write('world') sys.stderr.write('error message') sys.exit(1) # raise SystemExit("error message")

执行:

python3 xxx.py >/dev/null

结果:worlderror message

python3 xxx.py 2>/dev/null

结果:hello

4、使用getpass库读取密码

getuser函数用来从环境变量中获取用户名,后者用来等待用户输入密码。getpass函数和input函数的区别在于,它不会将输入的密码显示在命令行中,从而避免输入的密码被他人看到

示例:

#!/usr/bin/python3 # -*-coding:UTF-8-*-

import getpass user = getpass.getuser() passwd = getpass.getpass("your password: ") print(user,passwd)

5、使用ConfigParse解析配置文件

注意:在Python3中,ConfigParser模块重命名为configparser模块,使用上有细微差异

一个典型的配置文件包含一到多个章节(section),每个章节下可以包含一个到多个选项(option)

下面以MySQL的配置文件为例:

[mysqld] basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp skip-external-locking [client] user = mysql password = mysql port = 3306 host = 127.0.0.1

configparser中有很多的方法,其中与读取配置文件,判断配置项相关的方法有:

sections:返回一个包含所有章节的列表
has_section:判断章节是否存在
items:以元组的形式返回所有选项
options:返回一个包含章节下所有选项的列表
has_option:判断某个选项是否存在
get、getboolean、getint、getfloat:获取选项的值

示例:

#!/usr/bin/python3 # -*-coding:UTF-8-*-

import configparser temp = configparser.ConfigParser(allow_no_value=True)   # allow_no_value=False,表示配置文件中是否允许选项没有值的情况
 temp.read('my.cnf') print(temp.sections()) print(temp.has_section('client')) print(temp.options('client')) print(temp.has_option('client', 'user')) print(temp.get('client', 'host')) print(temp.getint('client', 'port'))

配置文件中有2个章节,分别是mysqld和client。其中,client章节有4个选项。可以通过sections方法获取所有的章节,通过options方法获取某个章节下所有的选项,也可以通过has_section方法判断某个章节是否存在,通过has_option方法判断某个选项是否存在。

在读取选项的内容时,get方法默认以字符串的形式返回。如果需要读取一个整数,则使用getint方法读取;如果需要读取一个布尔的取值,则使用getboolean方法读取。

configparser也提供了许多方法便于修改配置文件:

remove_section:删除一个章节
add_section:添加一个章节
remove_option:删除一个选项
set:添加一个选项
write:将configparser对象中的数据保存到文件中

示例:

#!/usr/bin/python3 # -*-coding:UTF-8-*-

import configparser temp = configparser.ConfigParser(allow_no_value=True) temp.read('my.cnf') temp.remove_section('client') temp.add_section('mysql') temp.set('mysql', 'host', '127.0.0.1') temp.set('mysql', 'port', '3306') temp.write(open('my.cnf', 'w'))

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM