Argumentos de entrada e linha de comando do usuário [fechados]

525

Como eu tenho um script Python que a) pode aceitar a entrada do usuário e como faço para que ele b) seja lido nos argumentos se executado a partir da linha de comando?

Teifion
fonte
9
A resposta dependerá da sua versão do Python. Python 3.x faz isso um pouco diferente do que Python 2.7
steampowered
4
E o Python 2.7 também faz isso de maneira um pouco diferente das versões anteriores ao 2.7, por exemplo, em argparsevez de optparse.
HelloGoodbye 22/01

Respostas:

501

Para ler a entrada do usuário, você pode tentar o cmdmódulo para criar facilmente um mini-interpretador de linha de comando (com textos de ajuda e preenchimento automático) e raw_input( inputpara Python 3+) para ler uma linha de texto do usuário.

text = raw_input("prompt")  # Python 2
text = input("prompt")  # Python 3

Entradas de linha de comando estão em sys.argv. Tente isso no seu script:

import sys
print (sys.argv)

Existem dois módulos para analisar as opções da linha de comando: optparse(obsoleto desde o Python 2.7, use em argparsevez disso) e getopt. Se você quiser apenas inserir arquivos no seu script, observe o poder de fileinput.

A referência da biblioteca Python é seu amigo.

Antti Rasinen
fonte
71
raw_inputfoi renomeado para inputno Python 3.x - documentação aqui
steampowered
1
O sys.argv precisa ser fornecido com o número do argumento, se suponha que você passe um parâmetro como um valor, por exemplo. python file_name.py 10/02/2017 e você deseja usar a data, ela deve ser sys.argv [1], caso contrário, será uma lista como [file_name.py, 10/02/2017]
Aravind Krishnakumar
467
var = raw_input("Please enter something: ")
print "you entered", var

Ou para Python 3:

var = input("Please enter something: ")
print("You entered: " + var)
lbz
fonte
26
Note-se que você não precisa importar raw_input, é uma função interna.
Dennis Golomazov 02/07/2014
7
Você não precisa usar str () na concatenação de impressão, pois todos os dados inseridos serão do tipo str (ing) por padrão (números pares).
Goujon
202

raw_inputnão está mais disponível no Python 3.x. Mas raw_inputfoi renomeadoinput , existe a mesma funcionalidade.

input_var = input("Enter something: ")
print ("you entered " + input_var) 

Documentação da mudança

a vapor
fonte
24
No Python 2.7, input () não converte valores em strings. Portanto, se você tentar fazer isso: input_variable1 = input ("Digite a primeira palavra ou frase:"), você receberá um erro: Traceback (última chamada mais recente): return eval (raw_input (prompt)) Arquivo "<string> ", linha 1, no <module> NameError: o nome 'ruim' não está definido
IgorGanapolsky
input_var = input ("Pressione 'E' e 'Enter' para sair:") NameError: name 'e' não está definido. Estou usando o Python 2.5. Como, eu posso superar esse erro.
Deepak Dubey
Você pode evitar o aviso do Traceback usando a seguinte importação que acompanha o Python 2.7:import fileinput result=[] for line in fileinput.input(): result.append(line)
Stefan Gruenwald
Aqui está mais da história e da justificativa: python.org/dev/peps/pep-3111
Julian
33

A melhor maneira de processar argumentos de linha de comando é o argparsemódulo.

Use raw_input()para obter a entrada do usuário. Se você importar, readline moduleseus usuários terão edição e histórico de linhas.

Dave Webb
fonte
readline disponível apenas no unix imediatamente.
ouriço demente Dem
5
argparse é o novo optparse
Niels Bom
18

Cuidado para não usar a inputfunção, a menos que você saiba o que está fazendo. Ao contrário raw_input, inputaceita qualquer expressão python, então é meio queeval

Vhaerun
fonte
15

Este programa simples ajuda você a entender como alimentar a entrada do usuário na linha de comando e mostrar ajuda na transmissão de argumentos inválidos.

import argparse
import sys

try:
     parser = argparse.ArgumentParser()
     parser.add_argument("square", help="display a square of a given number",
                type=int)
    args = parser.parse_args()

    #print the square of user input from cmd line.
    print args.square**2

    #print all the sys argument passed from cmd line including the program name.
    print sys.argv

    #print the second argument passed from cmd line; Note it starts from ZERO
    print sys.argv[1]
except:
    e = sys.exc_info()[0]
    print e

1) Para encontrar a raiz quadrada de 5

C:\Users\Desktop>python -i emp.py 5
25
['emp.py', '5']
5

2) Passando argumento inválido que não seja o número

C:\Users\bgh37516\Desktop>python -i emp.py five
usage: emp.py [-h] square
emp.py: error: argument square: invalid int value: 'five'
<type 'exceptions.SystemExit'>
Viswesn
fonte
10

Use 'raw_input' para entrada de um console / terminal.

se você quiser apenas um argumento de linha de comando como um nome de arquivo ou algo assim, por exemplo

$ python my_prog.py file_name.txt

então você pode usar o sys.argv ...

import sys
print sys.argv

sys.argv é uma lista em que 0 é o nome do programa, portanto, no exemplo acima, sys.argv [1] seria "file_name.txt"

Se você deseja ter opções completas de linha de comando, use o módulo optparse.

Pev

Simon Peverett
fonte
9

Se você estiver executando o Python <2.7, precisará optparse , que, conforme o documento explica, criará uma interface para os argumentos da linha de comando chamados quando o aplicativo for executado.

No entanto, no Python ≥2.7, optparse foi descontinuado e foi substituído pelo argparse, como mostrado acima. Um exemplo rápido dos documentos ...

O código a seguir é um programa Python que pega uma lista de números inteiros e produz a soma ou o máximo:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print args.accumulate(args.integers)
Matt Olan
fonte
6

Se for uma versão 3.x, basta usar:

variantname = input()

Por exemplo, você deseja inserir 8:

x = input()
8

x será igual a 8, mas será uma sequência, exceto se você definir de outra forma.

Então você pode usar o comando convert, como:

a = int(x) * 1.1343
print(round(a, 2)) # '9.07'
9.07
CorpseDead
fonte
3

No Python 2:

data = raw_input('Enter something: ')
print data

No Python 3:

data = input('Enter something: ')
print(data)
Marca
fonte
2
import six

if six.PY2:
    input = raw_input

print(input("What's your name? "))
Will Charlton
fonte