parâmetros de linha de comando argparse
1. Descrição do parâmetro:
nome ou sinalizadores - um nome ou uma lista de strings de opções, como foo ou -f, --foo.
ação - o tipo básico de ação usada quando o parâmetro aparece na linha de comando, ação - a ação quando a linha de comando encontra o parâmetro, o valor padrão é armazenar.
– store_const, significa que a atribuição é const;
–append, armazena os valores encontrados em uma lista, ou seja, se os parâmetros forem repetidos, múltiplos valores serão salvos;
–append_const, salva um valor definido na especificação do parâmetro em uma lista;
– count , armazena o número de encontros; além disso, você também pode herdar argparse.Action para personalizar a análise de parâmetros;
nargs é usado para descrever o número de parâmetros passados, '+' significa passar pelo menos um parâmetro
nargs - o número de parâmetros de linha de comando que devem ser lidos, pode ser
um número específico ou um sinal ?, quando nenhum valor é especificado, para Usar padrão para argumento posicional e use const
ou sinal * para argumento opcional, que significa 0 ou mais parâmetros;
ou sinal +, que significa 1 ou mais parâmetros.
const - uma constante exigida por algumas seleções de ações e nargs.
padrão - o valor usado quando o parâmetro não aparece na linha de comando.
type - o tipo para o qual o argumento da linha de comando deve ser convertido. (int, lista, str, tupla, conjunto, ditado)
escolhas - um contêiner de parâmetros disponíveis.
obrigatório - se esta opção de linha de comando pode ser omitida, o padrão é falso.
ajuda - uma breve descrição do que esta opção faz.
metavar – Exemplo de valores de parâmetros usados em mensagens de uso.
dest - o nome do atributo a ser adicionado ao objeto retornado por parse_args().
2. Uso de parâmetros
1. O
parâmetro name name é usado para chamar diretamente args.name.
Existem duas maneiras de definir o nome do parâmetro. A diferença se reflete no fato de haver – ou - antes do nome (quando o nome é abreviado).
O parâmetro necessário (sem -) é o seguinte: A ordem das configurações corresponde à leitura e você não precisa escrever um nome ao chamar.
Parâmetros opcionais (com -): Você pode ler fora de ordem e precisa escrever um nome quando ligando.
2. Parâmetros posicionais
Ao passar parâmetros na linha de comando, a ordem dos parâmetros passados é diferente e os resultados da execução geralmente são diferentes.Isso ocorre porque são usados parâmetros posicionais, como
import argparse
parser = argparse.ArgumentParser(description= 'nome' )
parser.add_argument('param1', type=str,help='sobrenome')
parser.add_argument('param2', type=str,help='nome')
args = parser.parse_args()
# Imprimir nome
print(args .param1+args.param2)
#Defina parâmetros posicionais:
parser.add_argument('outfile')
3. Parâmetros opcionais
Para evitar o bug dos parâmetros posicionais acima na linha de comando (é fácil esquecer a ordem), você pode usar parâmetros opcionais. Isso é um pouco como parâmetros de passagem de palavras-chave, mas você precisa adicionar – na frente das palavras-chave. Embora parâmetros opcionais O método de escrita seja relativamente complicado, mas aumenta a legibilidade da linha de comando e torna menos provável que cause confusão de dados devido à ordem em que os parâmetros são passados. Por exemplo:
a entrada acima deve ter um raio de 1 na frente e uma altura de 3 atrás. Se você quiser alterar a ordem da entrada ou carregar o nome do parâmetro ao mesmo tempo que o parâmetro de entrada, você pode use o parâmetro de seleção e adicione dois analisadores "-" antes do nome do parâmetro ao adicionar o parâmetro
.
Existe outra maneira de parâmetro alias através de "-". Observe que o nome do parâmetro modificado por "-" deve existir:
parser.add_argument ('-r', '–radius', type=int, help='Radius of cilindro')
parser.add_argument(' -H', '–height', type=int, help='Altura do cilindro')
4. Nargs
é usado para descrever o número de parâmetros passados, que pode ser
um número específico: quantos '*'s devem ser passados
: qualquer
'?': um ou nenhum 1/0
'+': pelo menos um ≥ 1
período posterior Quando você chama esse parâmetro, ele armazena o que você passa na forma de uma lista.
Então vamos melhorar o programa acima para encontrar a soma de dois inteiros.
import argparse
parser = argparse.ArgumentParser(description='This código é usado para encontrar a soma de dois inteiros. Soma de inteiros')
#Este objeto de análise é equivalente a um contêiner total que armazena todas as informações
parser.add_argument("integers", type=int,nargs=2,help="first inteiro")
5. Tipo
type é usado para determinar qual tipo de dados você usa para ler os parâmetros.
O padrão é uma string, igual à função de entrada.
6. Atributo obrigatório
Você pode opcionalmente adicionar o atributo necessário na etapa de adição de parâmetros. Durante o processo de entrada da linha de comando, se você especificar apenas determinados parâmetros e os valores de outros parâmetros não forem especificados, você poderá executar o programa, qual não é Parâmetros cujos valores são especificados será atribuído o valor Nenhum. O atributo obrigatório requer que o parâmetro receba um valor, caso contrário, um erro será relatado
parser.add_argument('-r', '–radius', type=int, metavar='', require=True, help='Radius do cilindro') parser.add_argument
( '-H', '–height', type=int, metavar='', require=True, help='Altura do cilindro')
7. Atributo dest
Você pode usar dest=xxx para definir o nome da variável do parâmetro em vez de "-xxx". Da mesma forma, use args.xxx no código para obter o valor do parâmetro.
parser.add_argument('-r', destino='raio', type=int, help='Raio do cilindro')
parser.add_argument('-H', dest='altura', type=int, help='Altura do cilindro')
8. A ação usa parâmetros mutuamente exclusivos
4. Conversão mútua entre argparse e dict
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--face', help='use this face', dest='source_img')
parser.add_argument('-t', '--target', help='replace this face', dest='target_path')
parser.add_argument('-o', '--output', help='save output to this file', dest='output_file')
parser.add_argument('--keep-fps', help='maintain original fps', dest='keep_fps', action='store_true', default=False)
parser.add_argument('--keep-frames', help='keep frames directory', dest='keep_frames', action='store_true', default=False)
parser.add_argument('--all-faces', help='swap all faces in frame', dest='all_faces', action='store_true', default=False)
parser.add_argument('--max-memory', help='maximum amount of RAM in GB to be used', dest='max_memory', type=int)
parser.add_argument('--cpu-cores', help='number of CPU cores to use', dest='cpu_cores', type=int, default=max(8 / 2, 1))
parser.add_argument('--gpu-threads', help='number of threads to be use for the GPU', dest='gpu_threads', type=int, default=8)
parser.add_argument('--gpu-vendor', help='choice your GPU vendor', dest='gpu_vendor', choices=['apple', 'amd', 'intel', 'nvidia'])
args = parser.parse_known_args()[0]
print('所有参数:',args)
print('图片参数:',args.source_img)
print('---------------------------------------')
# 此时得到的configs为Namespace类型,它包含了__dict__属性,
# 因此可以使用vars将configs转换为字典dic(只要变量包含了__dict__属性就可以使用vars转换为字典)
print('类型argperser:',type(args))
dic = vars(args)
print('类型dict:', type(dic))
print('---------------------------------------')
# 1、argparser转字典
args_dict = vars(args)
# use the dict
for k in args_dict.keys():
print(k, args_dict[k], type(args_dict[k]))
print('---------------------------------------')
# 2、 dict 转ArgumentParser
# create a dict object
a_student = {
'Name': 'JACK Williams',
'ID': 391568,
'At_School': True,
'Math_Score': 92.3}
# transfer the dict object to an ArgumentParser object
args = argparse.Namespace(**a_student)
print('类型argparser:', type(args))
# use the ArgumentParser object
print(args.Name, type(args.Name))
print(args.ID, type(args.ID))
print(args.At_School, type(args.At_School))
print(args.Math_Score, type(args.Math_Score))
if __name__ == '__main__':
main()
# 运行参考
# python run.py --gpu-vendor nvidia --keep-fps --all-faces -f img/face/mimi.jpg -t img/video/nui.mp4 -o img/out/nui.mp4
5. Código de referência
import math
import argparse
parser = argparse.ArgumentParser(description='Calculate volume of a cylinder')
parser.add_argument('-r', '--radius', type=int, metavar='', required=True, help='Radius of cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', required=True, help='Height of cylinder')
# 添加互斥组
group = parser.add_mutually_exclusive_group()
# 给互斥组添加两个参数
# 给参数的action属性赋值store_true,程序默认为false,当你执行这个命令的时候,默认值被激活成True
group.add_argument('-q', '--quiet', action='store_true', help='Print quiet')
group.add_argument('-v', '--verbose', action='store_true', help='Print verbose')
args = parser.parse_args()
def cylinder_volume(radius, height):
vol = (math.pi) * (radius**2) * (height) # 体积公式
return vol
if __name__ == '__main__':
volume = cylinder_volume(args.radius, args.height)
# 互斥参数
if args.quiet:
print(volume)
elif args.verbose:
print('Volume of a Cylinder with radius %s and height %s is %s' % (args.radius, args.height, volume))
else:
print('Volume of Cylinder = %s' % volume)
# 这就是互斥参数如何工作的,你不能同时执行两个命令,你可以执行一个,所以和互斥组里的两个参数交互时,你只能
# 执行quiet和verbose中的一个,或者是都不执行按照默认计划来
# 使用: python test_argparse.py -r 2 -H 4
# python test_argparse.py -r 2 -H 4 -v
# python test_argparse.py -r 2 -H 4 -q
9. metavar - Exemplos de valores de parâmetros usados em mensagens de métodos de uso, auxiliando o parâmetro -h a visualizar informações de descrição.
3. Programa
# backup.py
import argparse
def main():
# 定义一个ArgumentParser实例:
parser = argparse.ArgumentParser(
prog='backup', # 程序名
description='Backup MySQL database.', # 描述
epilog='Copyright(r), 2023' # 说明信息
)
# 定义位置参数:
parser.add_argument('outfile')
# 定义关键字参数:
parser.add_argument('--host', default='localhost')
# 此参数必须为int类型:
parser.add_argument('--port', default='3306', type=int)
# 允许用户输入简写的-u:
parser.add_argument('-u', '--user', required=True)
parser.add_argument('-p', '--password', required=True)
parser.add_argument('--database', required=True)
# gz参数不跟参数值,因此指定action='store_true',意思是出现-gz表示True:
parser.add_argument('-gz', '--gzcompress', action='store_true', required=False, help='Compress backup files by gz.')
# 解析参数:
args = parser.parse_args()
print('解析完参数:',args)
print('类型:',type(args))
args.outfile='take a set'
# 打印参数:
print('parsed args:')
print(f'outfile = {
args.outfile}')
print(f'host = {
args.host}')
print(f'port = {
args.port}')
print(f'user = {
args.user}')
print(f'password = {
args.password}')
print(f'database = {
args.database}')
print(f'gzcompress = {
args.gzcompress}')
if __name__ == '__main__':
main()
# $ ./backup.py -u root -p hello --database testdb backup.sql
参考: https: // blog.csdn.net / RudeTomatoes / artigo / detalhes / 117003291
https: // zhuanlan.zhihu.com / p / 56922793