python接收命令行参数

# -*- coding: utf-8 -*-

import getopt,sys

# https://blog.csdn.net/u010951938/article/details/50864993
# 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

# https://blog.csdn.net/u010951938/article/details/50864993
# 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))






总结:

# https://blog.csdn.net/u010951938/article/details/50864993
# 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

当然,还有另外一种方式:

blog.csdn.net/jinguasu/article/details/74908759?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

python中的optionParser模块 - 努力奋斗的阿贝拉 - 博客园

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__Tsun 的博客-CSDN博客

今天才发现,我当初学的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  # https://blog.csdn.net/mg1507/article/details/124468327

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值