2012-05-25 22 views
17

Estoy familiarizado con C y he comenzado a experimentar en python. Mi pregunta es sobre el 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 espero.Argumentos de línea de comando en python.

Código:

import sys 

a = sys.argv[1] 
b = sys.argv[2] 

print a, b 

print a+b 

de entrada:

python mySum.py 100 200 

Salida:

100 200 
100200 

Cuando agrego los dos argumentos que se concatenan en lugar de los dos valores se suman. Parece que los valores se están tomando como cadenas.

¿Cómo puedo interpretarlos como numéricos?

+1

Un problema similar ocurriría en C: los argumentos se pasan a 'main()' como cadenas, y necesitarías usar 'sscanf()' o 'atoi()' para convertirlos a enteros. –

+0

Este es un título muy vago. ¿Alguien puede editarlo para describir con precisión la pregunta? –

Respuesta

23

Puede convertir los argumentos a números enteros usando int()

import sys 

a = int(sys.argv[1]) b = int(sys.argv[2]) 

print a, b 

print a+b 

de entrada: python mySum.py 100 200

de salida:

100 200 
300 
11

De hecho, se han encontrado el problema por sí mismo, sys.argv es una conjunto de cadenas.

Puede transformar una cadena en un entero con int(). En este caso, por ejemplo: a = int(sys.argv[1])

+0

Gracias Peter Smit .. – Kalyan

4

sys.argv artículos son siempre strings. debe enviarlos al int con int(a).

También puede usar bibliotecas de terceros para manejar argumentos CLI como OptParse.

10

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 
+0

Estaba a punto de escribir una nueva respuesta que dice que uno debe validarla antes de usar int(), ¡antes de ver tu respuesta! También se puede usar isdigit() que devuelve TRUE si todos los caracteres de la cadena son (0-9). –

0

En Python, las cadenas no se convierten implícitamente a enteros. Trate

num1 = int(sys.argv[1]) 
This would represent the numerical value of the number, not its string representation. 
0

Cuidado con la realización de comparaciones que involucran argumentos de línea de comandos, que pueden conducir a realmente comportamiento inesperado debido a la política de Python 2 para la comparación de objetos de diferentes tipos ('int' < 'lista' < 'cadena '<' tupla ') como se indica here. En Python 3, la comparación de objetos de diferentes tipos dará lugar a un TypeError.

Para obtener un ejemplo de caos de comparación de objetos, intente eliminar la llamada int() en la sección 6.1.1. del Python tutorial Fibonacci code y obtendrás un bucle infinito, ya que la condición del ciclo while se convierte en: 'int' < 'cadena'. (Esto no sucedería en Perl, por cierto).

Un gran consejo de @ Jan-Philip de arriba para validar argumentos de línea de comandos, incluso para Python 3.

Cuestiones relacionadas