Como acesso argumentos de linha de comando no Python?


362

Eu uso o python para criar as configurações do meu projeto, mas preciso de ajuda para obter os argumentos da linha de comando.

Eu tentei isso no terminal:

$python myfile.py var1 var2 var3

No meu arquivo Python, quero usar todas as variáveis ​​que são inseridas.


11
O módulo baker é uma ótima ferramenta para escrever aplicativos de linha de comando Python. pypi.python.org/pypi/Baker/1.02
Spike Gronim

Respostas:



116
import sys

sys.argv[1:]

fornecerá uma lista de argumentos (sem incluir o nome do arquivo python)


5
O que [1:]significa isso ?
Kolob Canyon

8
@KolobCanyon significa "pegar uma sub-lista começando do índice 1 até o fim", ou seja, pular o primeiro elemento
Kamil Jarosz

@KolobCanyon leva o segundo argumento [1:]para cima, porque o primeiro argumento de sys.argvé por padrão o nome do arquivo python que você está executando, por exemplo testrun.py.
Samuel Nde

95

Eu recomendo o argparseque vem com o Python 2.7 e posterior.

O argparsemódulo reduz o código da placa da caldeira e torna seu código mais robusto, porque o módulo lida com todos os casos de uso padrão (incluindo subcomandos), gera a ajuda e o uso para você, verifica e higieniza a entrada do usuário - tudo o que você precisa se preocupar quando precisar estão usando sys.argvabordagem. E é de graça (embutido).

Aqui está um pequeno exemplo:

import argparse

parser = argparse.ArgumentParser("simple_example")
parser.add_argument("counter", help="An integer will be increased by 1 and printed.", type=int)
args = parser.parse_args()
print(args.counter + 1)

e a saída para python prog.py -h

usage: simple_example [-h] counter

positional arguments:
  counter     counter will be increased by 1 and printed.

optional arguments:
  -h, --help  show this help message and exit

e python prog.py 1como você esperaria:

2

7
Resposta de qualidade, sem saber ao certo por que alguém aqui usaria qualquer uma das outras abordagens fornecidas aqui. Especialmente porque está embutido! Vocês não têm coisas melhores para fazer do que analisar?
Bassinator 23/09

Só para citar como você deve acessar o argumento específico em args namespace: args.counter
MikeL

11
@Bassinator Nos casos em que nenhuma análise de argumento é necessária.
reduzindo a atividade

para usar o valor padrão, sem valor específico na linha de comando, você pode usar algo como: parser.add_argument('var3', nargs='?', type=int, default=3)var3 é um parâmetro opcional; se você não especificar um valor na linha de comando, poderá acessar a var3 no seu código, valor padrão para var3 = 3
Albicocco

56

Código Python:

import sys

# main
param_1= sys.argv[1] 
param_2= sys.argv[2] 
param_3= sys.argv[3]  
print 'Params=', param_1, param_2, param_3

Invocação:

$python myfile.py var1 var2 var3

Resultado:

Params= var1 var2 var3 

24

Você pode usar sys.argvpara obter os argumentos como uma lista.

Se você precisar acessar elementos individuais, poderá usar

sys.argv[i]  

onde iestá index, 0fornece o nome do arquivo python que está sendo executado. Qualquer índice depois disso são os argumentos passados.


6

Se você chamar assim: $ python myfile.py var1 var2 var3

import sys

var1 = sys.argv[1]
var2 = sys.argv[2]
var3 = sys.argv[3]

Semelhante às matrizes que você também possui, sys.argv[0]que é sempre o diretório de trabalho atual.


6
sys.argv[0]não é o diretório de trabalho atual. É o nome do arquivo que está sendo executado.
veja

5

Algumas coisas adicionais em que consigo pensar.

Como o @allsyed disse, o sys.argv fornece uma lista de componentes (incluindo o nome do programa); portanto, se você quiser saber o número de elementos transmitidos pela linha de comando, use len () para determiná-lo. Com base nisso, você pode criar mensagens de exceção / erro se o usuário não passar um número específico de parâmetros.

Além disso, se você estiver procurando uma maneira melhor de lidar com argumentos de linha de comando, sugiro que você consulte https://docs.python.org/2/howto/argparse.html

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.