imprimir - print en python 3
Los números pasados como argumentos de línea de comando en python no se interpretan como enteros (6)
Estoy familiarizado con C, y he comenzado a experimentar en Python. Mi pregunta es con respecto al comando sys.argv
. He leído que se usa para un intérprete de línea de comandos, pero cuando intento ejecutar un programa simple no obtengo los resultados que esperaba.
Código:
import sys
a = sys.argv[1]
b = sys.argv[2]
print a, b
print a+b
Entrada:
python mySum.py 100 200
Salida:
100 200
100200
Cuando agrego los dos argumentos, se concatenan en lugar de que los dos valores se agreguen juntos. Parece que los valores están siendo tomados como cadenas.
¿Cómo puedo interpretarlos como números?
De hecho, usted mismo ha encontrado el problema, sys.argv
es una serie de cadenas.
Puede transformar una cadena en un entero con int()
. En este caso, por ejemplo: a = int(sys.argv[1])
En Python, las cadenas no se convierten implícitamente a números enteros. Tratar
num1 = int(sys.argv[1])
This would represent the numerical value of the number, not its string representation.
Puedes convertir los argumentos a enteros usando int ()
import sys
a = int(sys.argv[1]) b = int(sys.argv[2])
print a, b
print a+b
entrada: python mySum.py 100 200
salida:
100 200
300
También debe validar la entrada del usuario:
import sys
def is_intstring(s):
try:
int(s)
return True
except ValueError:
return False
for arg in sys.argv[1:]:
if not is_intstring(arg):
sys.exit("All arguments must be integers. Exit.")
numbers = [int(arg) for arg in sys.argv[1:]]
sum = sum(numbers)
print "The sum of arguments is %s" % sum
Tenga cuidado de realizar comparaciones que involucren argumentos de línea de comando, lo que puede llevar a un comportamiento realmente inesperado debido a la política de Python 2 para comparar objetos de diferentes tipos (''int'' <''list'' <''string'' <''tupla'') como se indica here . En Python 3, la comparación de objetos de diferentes tipos conducirá a un TypeError.
Para ver un ejemplo de caos en la comparación de objetos, intente eliminar la llamada int()
en la sección 6.1.1. del código Fibonacci del tutorial de Python y obtendrás un bucle infinito, ya que la condición del bucle while se convierte en: ''int'' <''string''. (Esto no sucedería en Perl, por cierto).
Un gran consejo de @ Jan-Philip arriba para validar los argumentos de la línea de comandos, incluso para Python 3.
sys.argv
elementos de sys.argv
siempre son strings
. deberías lanzarlos a int
con int(a)
.
También puede usar bibliotecas de terceros para manejar argumentos de la CLI, como OptParse .