Entrada de usuario y argumentos de línea de comando [cerrado]

525

¿Cómo tengo un script de Python que a) puede aceptar la entrada del usuario y cómo lo hago b) leer en argumentos si se ejecuta desde la línea de comandos?

Teifion
fuente
99
La respuesta dependerá de su versión de Python. Python 3.x hace esto un poco diferente a Python 2.7
impulsado por vapor el
44
Y Python 2.7 también hace esto un poco diferente a las versiones anteriores a 2.7, por ejemplo, en argparselugar de optparse.
HelloGoodbye

Respuestas:

501

Para leer la entrada del usuario, puede probar el cmdmódulo para crear fácilmente un mini intérprete de línea de comando (con textos de ayuda y autocompletado) y raw_input( inputpara Python 3+) para leer una línea de texto del usuario.

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

Las entradas de la línea de comando están adentro sys.argv. Prueba esto en tu script:

import sys
print (sys.argv)

Hay dos módulos para analizar las opciones de la línea de comandos: optparse(en desuso desde Python 2.7, use argparseen su lugar) y getopt. Si solo desea ingresar archivos a su script, contemple el poder de fileinput.

La referencia de la biblioteca de Python es tu amigo.

Antti Rasinen
fuente
71
raw_inputfue renombrado inputen Python 3.x - documentación aquí
alimentado a vapor el
1
sys.argv necesita un número de argumento, si se supone que pasa un parámetro como un valor, por ejemplo. python file_name.py 2017-02-10 y desea utilizar la fecha, debe ser sys.argv [1] de lo contrario será una lista como [file_name.py, 2017-02-10]
Aravind Krishnakumar
467
var = raw_input("Please enter something: ")
print "you entered", var

O para Python 3:

var = input("Please enter something: ")
print("You entered: " + var)
lbz
fuente
26
Cabe señalar que no tiene que importar raw_input, es una función integrada.
Dennis Golomazov
77
No tiene que usar str () en la concatenación de impresión ya que todos los datos ingresados ​​serán de tipo str (ing) por defecto (números pares).
Goujon
202

raw_inputya no está disponible en Python 3.x. Pero raw_inputfue renombrado input, por lo que existe la misma funcionalidad.

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

Documentación del cambio.

vapor accionado
fuente
24
En Python 2.7, input () no convierte los valores en cadenas. Entonces, si intenta hacer esto: input_variable1 = input ("Ingrese la primera palabra o frase:"), obtendrá un error: Traceback (última llamada más reciente): return eval (raw_input (prompt)) File "<string> ", línea 1, en <module> NameError: el nombre 'malo' no está definido
IgorGanapolsky
input_var = input ("Presione 'E' y 'Enter' para salir:") NameError: el nombre 'e' no está definido Estoy usando Python 2.5. Cómo, puedo superar este error.
Deepak Dubey
Puede evitar el aviso de Rastreo utilizando la siguiente importación que viene con Python 2.7:import fileinput result=[] for line in fileinput.input(): result.append(line)
Stefan Gruenwald
Aquí hay más de la historia y la justificación: python.org/dev/peps/pep-3111
Julián
33

La mejor manera de procesar argumentos de línea de comandos es el argparsemódulo.

Use raw_input()para obtener la entrada del usuario. Si importa, readline modulesus usuarios tendrán edición de línea e historial.

Dave Webb
fuente
Sin embargo, readline solo está disponible en Unix de fábrica.
erizo demente
55
argparse es el nuevo optparse
Niels Bom
18

Tenga cuidado de no usar la inputfunción, a menos que sepa lo que está haciendo. A diferencia raw_input, inputaceptará cualquier expresión de Python, por lo que es un poco comoeval

Vhaerun
fuente
15

Este sencillo programa le ayuda a comprender cómo alimentar la entrada del usuario desde la línea de comandos y mostrar ayuda al pasar argumentos no vá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 la raíz cuadrada de 5

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

2) Pasar argumento inválido que no sea 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
fuente
10

Use 'raw_input' para la entrada desde una consola / terminal.

si solo desea un argumento de línea de comando como un nombre de archivo o algo por ejemplo

$ python my_prog.py file_name.txt

entonces puedes usar sys.argv ...

import sys
print sys.argv

sys.argv es una lista donde 0 es el nombre del programa, por lo que en el ejemplo anterior sys.argv [1] sería "file_name.txt"

Si desea tener opciones completas en la línea de comandos, use el módulo optparse.

Pev

Simon Peverett
fuente
9

Si está ejecutando Python <2.7, necesita optparse , que como explica el documento creará una interfaz para los argumentos de la línea de comandos que se invocan cuando se ejecuta su aplicación.

Sin embargo, en Python ≥2.7, optparse ha quedado en desuso y se reemplazó con el argumento arg como se muestra arriba. Un ejemplo rápido de los documentos ...

El siguiente código es un programa de Python que toma una lista de enteros y produce la suma o el 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
fuente
6

Si es una versión 3.x, simplemente use:

variantname = input()

Por ejemplo, desea ingresar 8:

x = input()
8

x será igual a 8 pero será una cadena excepto si la define de otra manera.

Para que pueda usar el comando de conversión, como:

a = int(x) * 1.1343
print(round(a, 2)) # '9.07'
9.07
Cadáver
fuente
3

En Python 2:

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

En Python 3:

data = input('Enter something: ')
print(data)
marca
fuente
2
import six

if six.PY2:
    input = raw_input

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