# -*- coding: utf-8 -*-
import getopt,sys
#
# 1. 处理所使用的函数叫getopt() ,因为是直接使用import 导入的getopt 模块,所以要加上限定getopt 才可以。
# 2. 使用sys.argv[1:] 过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)。
# 3. 使用短格式分析串"ho:" 。当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":" 号 。所以"ho:" 就表示"h" 是一个开关选项;"o:" 则表示后面应该带一个参数。
# 4. 使用长格式分析串列表:["help", "output="] 。长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数 。这个长格式表示"help" 是一个开关选项;"output=" 则表示后面应该带一个参数。
# 5. 调用getopt 函数。函数返回两个列表:opts 和args 。opts 为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数。opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串'' 。
# opts要在判断一开始就要符合标准,一开始不符合标准,就会为空。
# 比如python python接收命令行参数.py china -f 111 -t ----f_long="dadadadadadsa"
# 这里sys.argv[1:]一开始是“china”,不是-或--开头的,那么opts就会完全为空
# 从第一个不符合合法opts格式的参数开始,都会变成args的内容
# 总是opts在前,args在后,顺序不能颠倒
print(sys.argv[0]) #sys.argv[0]是python程序本身
shortargs = 'f:t' #短选项
longargs = ['directory-prefix=', 'format', '--f_long='] #长选项
# opts,args= getopt.getopt( sys.argv[2:], shortargs, longargs)
opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs)#opts的内容,必须以“-”或"--"开始,如果不是,则opts会未空列表
print('opts=',opts)
print('args=',args)
修改一下:
# -*- coding: utf-8 -*-
import getopt,sys
#
# 1. 处理所使用的函数叫getopt() ,因为是直接使用import 导入的getopt 模块,所以要加上限定getopt 才可以。
# 2. 使用sys.argv[1:] 过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)。
# 3. 使用短格式分析串"ho:" 。当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":" 号 。所以"ho:" 就表示"h" 是一个开关选项;"o:" 则表示后面应该带一个参数。
# 4. 使用长格式分析串列表:["help", "output="] 。长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数 。这个长格式表示"help" 是一个开关选项;"output=" 则表示后面应该带一个参数。
# 5. 调用getopt 函数。函数返回两个列表:opts 和args 。opts 为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数。opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串'' 。
# opts要在判断一开始就要符合标准,一开始不符合标准,就会为空。
# 比如python python接收命令行参数.py china -f 111 -t ----f_long="dadadadadadsa"
# 这里sys.argv[1:]一开始是“china”,不是-或--开头的,那么opts就会完全为空
# 从第一个不符合合法opts格式的参数开始,都会变成args的内容
# 总是opts在前,args在后,顺序不能颠倒
# 命令行调用的时候,"="是可有可无的。
def get_opts_files(opts):
for opt,arg in opts:
if opt=="--out_file":
out_file = arg
elif opt=="--excel_file":
excel_file = arg
elif opt=='--id_list':
id_list = arg
return(out_file,excel_file,id_list)
# print(sys.argv[0]) #sys.argv[0]是python程序本身
# shortargs = 'f:t' #短选项
# longargs = ['directory-prefix=', 'format', '--f_long=','excel_file=','id_list=','out_file='] #长选项
# opts,args= getopt.getopt( sys.argv[2:], shortargs, longargs)
# opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs)#opts的内容,必须以“-”或"--"开始,如果不是,则opts会未空列表
# print('opts=',opts)
# print('args=',args)
#
# for opt,arg in opts:
# print("Test:\t{}=>{}".format(opt,arg))
shortargs = 'f:t' #短选项
longargs = ['directory-prefix=', 'format', '--f_long=','excel_file=','id_list=','out_file='] #长选项
opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs)#opts的内容,必须以“-”或"--"开始,如果不是,则opts会未空列表
if __name__ == '__main__':
if len(sys.argv) == 1:
print("usage: python {} --id_list=/home/wubin/02.Project/sample_id.list --excel_file=/home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx --out_file=/home/wubin/02.Project/tag.docx".format(sys.argv[0]))
sys.exit()
out_file,excel_file,id_list = get_opts_files(opts)
print('out_file:\t{}'.format(out_file))
print('excel_file:\t{}'.format(excel_file))
print('id_list:\t{}'.format(id_list))
总结:
#
# 1. 处理所使用的函数叫getopt() ,因为是直接使用import 导入的getopt 模块,所以要加上限定getopt 才可以。
# 2. 使用sys.argv[1:] 过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)。
# 3. 使用短格式分析串"ho:" 。当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":" 号 。所以"ho:" 就表示"h" 是一个开关选项;"o:" 则表示后面应该带一个参数。
# 4. 使用长格式分析串列表:["help", "output="] 。长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数 。这个长格式表示"help" 是一个开关选项;"output=" 则表示后面应该带一个参数。
# 5. 调用getopt 函数。函数返回两个列表:opts 和args 。opts 为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数。opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串'' 。
# opts要在判断一开始就要符合标准,一开始不符合标准,就会为空。
# 比如python python接收命令行参数.py china -f 111 -t ----f_long="dadadadadadsa"
# 这里sys.argv[1:]一开始是“china”,不是-或--开头的,那么opts就会完全为空
# 从第一个不符合合法opts格式的参数开始,都会变成args的内容
# 总是opts在前,args在后,顺序不能颠倒;但长短选项的顺序可以随意变更
# 命令行调用的时候,"="是可有可无的。
命令行调用的时候,长选项的“=”是可有可无的。
(base) D:\Users\Administrator\PycharmProjects\MachineLearning\04.生成标签>python generate_tag_through_ids.py --id_list /home/wubin/02.Project/sample_id.list --excel_file /home/wubin/01.Program/01.script/GeneLab/sent2BGI
.xlsx --out_file /home/wubin/02.Project/tag.docx
out_file: /home/wubin/02.Project/tag.docx
excel_file: /home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx
id_list: /home/wubin/02.Project/sample_id.list
(base) D:\Users\Administrator\PycharmProjects\MachineLearning\04.生成标签>python generate_tag_through_ids.py --id_list=/home/wubin/02.Project/sample_id.list --excel_file=/home/wubin/01.Program/01.script/GeneLab/sent2BGI
.xlsx --out_file=/home/wubin/02.Project/tag.docx
out_file: /home/wubin/02.Project/tag.docx
excel_file: /home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx
id_list: /home/wubin/02.Project/sample_id.list
但如果使用了“=”,一定要注意,“=”两端是不能有空格的。比如下面这种用法是错误的。
错误在于“--out_file = /home/wubin/02.Project/tag.docx” 这里
(base) D:\Users\Administrator\PycharmProjects\MachineLearning\04.生成标签>python generate_tag_through_ids.py --id_list=/home/wubin/02.Project/sample_id.list --excel_file=/home/wubin/01.Program/01.script/GeneLab/sent2BGI
.xlsx --out_file = /home/wubin/02.Project/tag.docx
out_file: =
excel_file: /home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx
id_list: /home/wubin/02.Project/sample_id.list
短选项的opt和arg可以分开写,也可以写在一起,不要加“:”
(base) D:\Users\Administrator\PycharmProjects\MachineLearning\04.生成标签>python generate_tag_through_ids.py --id_list=/home/wubin/02.Project/sample_id.list --excel_file=/home/wubin/01.Program/01.script/GeneLab/sent2BGI
.xlsx --out_file=/home/wubin/02.Project/tag.docx -f8
out_file: /home/wubin/02.Project/tag.docx
excel_file: /home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx
id_list: /home/wubin/02.Project/sample_id.list
flow: 8
(base) D:\Users\Administrator\PycharmProjects\MachineLearning\04.生成标签>python generate_tag_through_ids.py --id_list=/home/wubin/02.Project/sample_id.list --excel_file=/home/wubin/01.Program/01.script/GeneLab/sent2BGI
.xlsx --out_file=/home/wubin/02.Project/tag.docx -f 8
out_file: /home/wubin/02.Project/tag.docx
excel_file: /home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx
id_list: /home/wubin/02.Project/sample_id.list
flow: 8
加了":"是错误的
(base) D:\Users\Administrator\PycharmProjects\MachineLearning\04.生成标签>python generate_tag_through_ids.py --id_list=/home/wubin/02.Project/sample_id.list --excel_file=/home/wubin/01.Program/01.script/GeneLab/sent2BGI
.xlsx --out_file=/home/wubin/02.Project/tag.docx -f:8
out_file: /home/wubin/02.Project/tag.docx
excel_file: /home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx
id_list: /home/wubin/02.Project/sample_id.list
flow: :8
(base) D:\Users\Administrator\PycharmProjects\MachineLearning\04.生成标签>python generate_tag_through_ids.py --id_list=/home/wubin/02.Project/sample_id.list --excel_file=/home/wubin/01.Program/01.script/GeneLab/sent2BGI
.xlsx --out_file=/home/wubin/02.Project/tag.docx -f: 8
out_file: /home/wubin/02.Project/tag.docx
excel_file: /home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx
id_list: /home/wubin/02.Project/sample_id.list
flow: :
(base) D:\Users\Administrator\PycharmProjects\MachineLearning\04.生成标签>python generate_tag_through_ids.py --id_list=/home/wubin/02.Project/sample_id.list --excel_file=/home/wubin/01.Program/01.script/GeneLab/sent2BGI
.xlsx --out_file=/home/wubin/02.Project/tag.docx -f8
out_file: /home/wubin/02.Project/tag.docx
excel_file: /home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx
id_list: /home/wubin/02.Project/sample_id.list
flow: 8
后面写的一个比较完善的脚本:
# -*- coding: utf-8 -*-
import getopt,sys
import numpy as np
import pandas as pd
import os
import re
import xlwt
import xlrd
from datetime import date, datetime
def get_opts_files(opts):
for opt,arg in opts:
if opt=="--out_file":
out_file = arg
elif opt=="--excel_file":
excel_file = arg
elif opt=='--id_list':
id_list = arg
elif opt=='-f':
flow = arg
return(out_file,excel_file,id_list,flow)
shortargs = 'f:t'
longargs = ['directory-prefix=', 'format', '--f_long=','excel_file=','id_list=','out_file=']
opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs)
if __name__ == '__main__':
if len(sys.argv) == 1:
print("usage: python {} --id_list=/home/wubin/02.Project/sample_id.list --excel_file=/home/wubin/01.Program/01.script/GeneLab/sent2BGI.xlsx --out_file=/home/wubin/02.Project/tag.docx".format(sys.argv[0]))
sys.exit()
out_file,excel_file,id_list,flow = get_opts_files(opts)
print("out_file:\t{}\nexcel_file:\t{}\nid_list:\t{}\nflow:\t{}".format(out_file,excel_file,id_list,flow))
这是在别人的程序中看到的。这种用法,感觉有点低效
[wubin@login2 ~/01.Program/02.software/krakenuniq/software]
$cat a.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
print sys.argv.index('China')
print sys.argv.index('Japan')
[wubin@login2 ~/01.Program/02.software/krakenuniq/software]
$python a.py China Japan
1
2
当然,还有另外一种方式
OptionParser 模块
#/home/wubin/miniconda3/bin/python
# -*- coding: utf-8 -*-
from optparse import OptionParser
parse = OptionParser()
parse.add_option('-i','--inputfile',dest='filename',default="XXX",help='please input your file')
parse.add_option('-p','--putfile',dest='putname',default="XXX",help='please put your name')
#(options,argvs) = parse.parse_args()
options,argvs = parse.parse_args()
print(options)
print(argvs)
与getopt模块一样,OptionParser最后获取的也是一个dict和一个list
注意: options,argvs = parse.parse_args() 中的options不是一个字典,而可能是一个类。
因此要取用'filename', 不是用options[filename], 而是options.filename
但比getopt强大之处在于,OptionParser可以允许命令行中的ARGV和options顺序任意颠倒和穿插。
python /home/wubin/01.Program/01.script/GeneLab/scan_download_dir.py MMMM NNNNN -i china -p japan KKKK JJJJ
{'putname': 'japan', 'filename': 'china'}
['MMMM', 'NNNNN', 'KKKK', 'JJJJ']
这个add_option函数的action参数,就可以将option设置为开关项。
但实际上, action参数的值除了“store”, “store_true”, “store_false”之外,还有一种 “append”。
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-f", "--file", action="append", dest="files",
help="specify a file to process")
(options, args) = parser.parse_args()
files = options.files or args
if files:
for file in files:
print(f"Processing file: {file}")
else:
print("No files specified.")
在这个例子中,-f
或 --file
选项被设置为 append
动作,这意味着它可以被多次使用。如果你在命令行中这样调用脚本:
action还有另一种值: count
Python 命令解析类库optparse | 西海岸
【2021-08-09】
optparse和 argparse
今天才发现,我当初学的optparse将被弃用,新的模块是:argparse
后者的教程见:
argparse --- 命令行选项、参数和子命令解析器 — Python 3.10.0 文档
# -*- coding: utf-8 -*-
import os, sys, re
import numpy as np
import pandas as pd
from optparse import OptionParser
import argparse #
parser = argparse.ArgumentParser(description="可写可不写,只是在命令行参数出现错误的时候,随着错误信息打印出来。")
parser.add_argument('-gf', '--girlfriend', choices=['jingjing', 'lihuan']) #长短选项都有,没错
parser.add_argument('-a', '--age', type=int, choices=[26, 32]) #只有短选项,也没错
parser.add_argument('--house', type=int, default=0) #只有长选项,没错
parser.add_argument('-b', type=int, choices=[26, 24]) #只有短选项,也没错
file_list_example = 'D:/软件安全下载目录/file_list.txt'
parse.add_argument('-F', '--file_list', dest='file_list_tmp', default=file_list_example,
help='a file list which contains files to be copied from Supercomputer platform')
parse.add_argument('-I', '--in_dir', dest='in_dir', default='/mnt/lustre/user/wubin/01.Program',
help='in_dir, used to create output_dir for output directories, with the prefix {out_dir}')
parse.add_argument('-D', '--out_dir', dest='out_dir', default='H:/01.Program',
help='output_directory to put files and directories in')
parse.add_argument('-c', '--count', dest='count',
help='count of files to copy, if not set, all files in {file_list} will be copied')
parse.add_argument('-E', '--print_example', action='store_true', dest='print_example',
help='print the example')
# positional argument
parser.add_argument('food')
args = parser.parse_args()
print('------args---------', args)
print('-------gf-------', args.girlfriend)
for i in args.__dict__:
print(f'{i}: {args.__dict__[i]}')
#=====================================逻辑说明===================================
# -gf 和 --girlfriend都可以在命令行中写
# 如果有dest参数, dest参数的结果就是dest
# 如果没有dest 参数,dest优先选择长的选项(--),如果没有长的选项(--),则选择短的选项符(-)
# 也就是说,dest的选择顺序是: dest > 长的选项(--) > 短的选项符(-)
# 可以测试一下:
# print(args.file_list) #报错,因为dest是file_list_tmp,所以应该是:args.file_list_tmp
# print(args.a) #报错,因为dest是age,所以应该是:args.age
# optparse包也遵守这个逻辑:dest > 长的选项(--) > 短的选项符(-)
这里要注意argparse与其前辈optparse的区别:
options, argvs = parse.parse_args() #optparse
args = parser.parse_args() #argparse
optparse将参数分成了options和argvs两部分
而argparse将其弄成了一个整体。
argv这部分的add方式如下,没有'-'或'--'。
parser.add_argument('food') #argparse