8.13 选项参数

如果程序每次运行都需要修改程序,将需要处理的文件写入程序内,这样非常麻烦。所以,一个程序需要能从命令行获取参数很重要。

python中有多种方法获取命令行选项参数,最简单的有sys.argv模块,还有更复杂的getoptargparse

1 sys.argv

sys.argv比较简单,可以通过sys.argv得到参数列表,其中sys.argv[0]是文件名称,此后的列表值是每一个参数,这里的参数列表也支持常规的列表操作。

只需要将需要输入的文件名替换为sys.argv[1]sys.argv[2]即可修改程序。

#导入模块
import sys
import gzip

f_object = gzip.open(sys.argv[1], 'rt')
f_output = gzip.open(sys.argv[2], 'wt')

for line in f_object:
   name = line.strip()[1:]
   id = ">" + str(name)
   line2 = f_object.readline()
   line3 = f_object.readline()
   line4 = f_object.readline()
   # print(id)
   # print(line2.strip())
   f_output.write(f"{id}\n")
   f_output.write(line2)

f_object.close()
f_output.close()

2 argparse

https://docs.python.org/zh-cn/3/library/argparse.html#module-argparse

如果想要使用更复杂的命令行选项参数,可以使用argparse模块。argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要哪些参数,argparse 将会知道如何从 sys.argv 解析它们。argparse模块还能自动生成帮助和用法消息文本。

argparse 模块对命令行接口的支持是围绕 argparse.ArgumentParser 的实例建立的。 它是一个用于参数规格说明的容器并包含多个全面应用解析器的选项:

首先:创建一个ArgumentParser实例:

import argparse

 parser = argparse.ArgumentParser(
   prog= 'fq2fa.py',
   description= 'This Program is used to translate fastq file to fasta file',
   epilog= 'visit our website for more infomation'
 )

 args = parser.parse_args()
 print(args)

命令行运行程序,并添加-h或者—help选项

python.exe main.py --help

usage: fq2fa.py [-h]

 

This Program is used to translate fastq file to fasta file

 

options:

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

 

visit our website for more infomation

接下来其他选项参数都可以使用ArgumentParser.add_argument() 方法来添加,该方法是模块中最重要的函数。可以添加位置参数,还可以添加短选项或者长选项以及为每个选项设置默认值等。下表中列出了add_argument()的一些重要参数说明。

表1 add_argument() 选项参数

名称 描述
action 指明应当如何处理一个参数 'store', 'store_const', 'store_true', 'append', 'append_const', 'count', 'help', 'version'
choices 将值限制为指定的可选项集合 ['foo', 'bar'], range(1, 10) 或 Container 实例
const 存储一个常量值
default 当未提供某个参数时要使用的默认值 默认为 None
dest 指定要在结果命名空间中使用的属性名称
help 某个参数的帮助消息
metavar 要在帮助中显示的参数替代显示名称
nargs 参数可被使用的次数 int, '?', '*' 或 '+'
required 指明某个参数是必需的还是可选的 True 或 False
type 自动将参数转换为给定的类型 int, float, argparse.FileType('w') 或可调用函数
import argparse

parser = argparse.ArgumentParser(
    prog= 'fq2fa.py',
    description= 'This Program is used to translate fastq file to fasta file',
    epilog= 'visit our website for more infomation'
)

# 添加位置选项,不带参数
parser.add_argument('filename')
# 同时设置长选项与短选项
parser.add_argument('-c', '--count', action='store_true', help='count')
# 设置默认值,默认为True
parser.add_argument('-v', '--verbose', action='store_true', help='verbose message')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('-s', '--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args)

argparse获取参数之后,通过parse_args()进行解析,将参数存入一个argparse.Namespace对象中,通过点号分别获取。

import argparse

parser = argparse.ArgumentParser(
    prog= 'fq2fa.py',
)

# 添加位置选项,不带参数
parser.add_argument('-i', '--input', help='input file', required=True)
parser.add_argument('-o', '--output', help='output', required=True)
parser.add_argument('-c', '--count', help='count',type=int)

args = parser.parse_args()
print(args)
print(args.input)
print(args.output)
print(args.count)