当前位置: 首页 > 工具软件 > 马克笔记 > 使用案例 >

python实用脚本 知乎_马克的Python学习笔记#实用脚本和系统管理

方承弼
2023-12-01

通过重定向,管道或者输入文件来作为脚本的输入

我们都希望自己编写的脚本能够接受任意的一种对用户来说最方便的输入机制。这应该包括从命令中产生脚本,把文件重定向到脚本,或者只是在命令行中传递一个或者一列文件名给脚本。对于这种情况,Python内置的fileinput模块使得这一切变得非常简单,如果有一个类似于这样的脚本:

import fileinput

with fileinput.input() as f_input:

for line in f_input:

print(line, end='')

那么我们已经可以让脚本按照上述所有的方式来接受输入了。如果将这个脚本保存为filein.py并且称为可执行的,那么就能够完成下列所有的操作并且能得到期望的输出

$ ls | ./filein.py # Prints a directory listing to stdout.

$ ./filein.py /etc/passwd # Reads /etc/passwd to stdout.

$ ./filein.py < /etc/passwd # Reads /etc/passwd to stdout.

函数fileinput.input()创建并且返回了一个FileInput类的实例。除了包含一些方便实用的帮助函数以外,该实例还可以当作上下文管理器来用。因此,把这些所有的结合在一起,如果我们打算编写一个脚本期望它能够立即从多个文件中打印输出,我们可以在输出中包含文件名和行号等信息:

>>> import fileinput

>>> with fileinput.input('/etc/passwd') as f:

>>> for line in f:

... print(f.filename(), f.lineno(), line, end='')

...

/etc/passwd 1 ##

/etc/passwd 2 # User Database

/etc/passwd 3 #

把它当作上下文管理器来使用可以确保文件不再使用的时候会被关闭,此外我们这里还利用了FileInput实例的帮助函数来获取一些额外的信息

终止程序并显示错误信息

有时候我们需要让我们的程序在终止的时候向标准错误输出答应一条消息并且返回一个非零的状态码

对于这种情况,我们可以发出一个SystemExit异常,但是要提供错误信息作为参数:

raise SystemExit('It failed!')

这样就会导致提供的信息被打印到sys.stderr上,并且程序退出的时候状态码为1

解析命令行选项

我们想编写一个程序用来解析在命令行中提供的各种选项(选项保存在sys.argv中)

对于这种需求,我们可以用argparse来解析命令行选项,比如像这个例子一样:

# search.py

'''Hypothetical command-line tool for searching a collection offiles for one or more text patterns.'''

import argparse

parser = argparse.ArgumentParser(description='Search some files')

parser.add_argument(dest='filenames',metavar='filename', nargs='*')

parser.add_argument('-p', '--pat',metavar='pattern', required=True,

dest='patterns', action='append',

help='text pattern to search for')

parser.add_argument('-v', dest='verbose', action='store_true',

help='verbose mode')

parser.add_argument('-o', dest='outfile', action='store',

help='output file')

parser.add_argument('--speed', dest='speed', action='store',

choices={'slow','fast'}, default='slow',

help='search speed')

args = parser.parse_args()

# Output the collected arguments

print(args.filenames)

print(args.patterns)

print(args.verbose)

print(args.outfile)

print(args.speed)

这个程序定义了一个如下使用的解析器:

bash % python3 search.py -h

usage: search.py [-h] [-p pattern] [-v] [-o OUTFILE] [--speed {slow,fast}]

[filename [filename ...]]

Search some files

positional arguments:

filename

optional arguments:

-h, --help show this help message and exit

-p pattern, --pat pattern

text pattern to search for

-v verbose mode

-o OUTFILE output file

--speed {slow,fast} search speed

下面的部分演示了程序中的数据部分。注意观察print()语句的打印输出。

bash % python3 search.py foo.txt bar.txt

usage: search.py [-h] -p pattern [-v] [-o OUTFILE] [--speed {fast,slow}]

[filename [filename ...]]

search.py: error: the following arguments are required: -p/--pat

bash % python3 search.py -v -p spam --pat=eggs foo.txt bar.txt

filenames = ['foo.txt', 'bar.txt']

patterns = ['spam', 'eggs']

verbose = True

outfile = None

speed = slow

bash % python3 search.py -v -p spam --pat=eggs foo.txt bar.txt -o results

filenames = ['foo.txt', 'bar.txt']

patterns = ['spam', 'eggs']

verbose = True

outfile = results

speed = slow

bash % python3 search.py -v -p spam --pat=eggs foo.txt bar.txt -o results \

--speed=fast

filenames = ['foo.txt', 'bar.txt']

patterns = ['spam', 'eggs']

verbose = True

outfile = results

speed = fast

argparse 模块是标准库中最大的模块之一,拥有大量的配置选项。 本节只是演示了其中最基础的一些特性,帮助你入门。

为了解析命令行选项,你首先要创建一个 ArgumentParser 实例, 并使用 add_argument() 方法声明你想要支持的选项。 在每个 add_argument() 调用中,dest 参数指定解析结果被指派给属性的名字。 metavar 参数被用来生成帮助信息。action 参数指定跟属性对应的处理逻辑, 通常的值为 store ,被用来存储某个值或将多个参数值收集到一个列表中。

还很多种其他方法解析命令行选项。 例如,你可能会手动的处理sys.argv或者使用getopt模块。 但是,如果你采用本节的方式,将会减少很多冗余代码,底层细节argparse模块已经帮你处理了。 你可能还会碰到使用optparse库解析选项的代码。 尽管optparse和argparse很像,但是后者更先进,因此在新的程序中你应该使用它。

参考书目:

《Python CookBook》作者:【美】 David Beazley, Brian K. Jones

 类似资料: