Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: winnipu en 19 Abril 2016, 15:26 pm



Título: cmd ejecucion def con *args
Publicado por: winnipu en 19 Abril 2016, 15:26 pm
Hola a todos. Vereis, bajo windows he creado un .py usando editor de txt con el siguiente codigo:
Código:
def media(*args):
sumatorio = 0
if numero in args:
sumatorio+=numero
total=sumatorio/len(args)
return total

Me gustaria poder ejecutar esta funcion desde la consola CMD pero he probado a ejecutarlo desde su directorio asi:
c:> nombreprograma.py media(1,2,3,4,5,6) y no me aparece ningun resultado. Es obvio que algo hago mal. Sabeis que?


Título: Re: cmd ejecucion def con *args
Publicado por: tincopasan en 19 Abril 2016, 20:38 pm
no sé si estoy entendiendo ¿querés llamar a la función desde la línea de comandos cómo un argumento?
si querés usar argumentos sería sobre el nombre del archivo y no llamando a la función. así como está es imposible que funcione ni la función ya que nunca la llamas.
si estás aprendiendo busca sobre llamar a funciones y sobre pasar argumentos.


Título: Re: cmd ejecucion def con *args
Publicado por: winnipu en 19 Abril 2016, 21:29 pm
Veras, lo que quiero es llamar desde el cmd de windows a la funcion media(*args) del programa nombreprograma.py  introduciendo si es posible los argumentos que yo quiera (una serie de numeros mas o menos grande). Todo ello desde la consola windows, para ver si me arroja el resultado en la misma consola. Es posible? O estoy intentando algo que no se puede hacer?
Perdona las dudas extrañas, estoy aprendiendo y se me ocurrio intentar lanzar un programa por consola.


Título: Re: cmd ejecucion def con *args
Publicado por: engel lex en 20 Abril 2016, 00:08 am
no estoy seguro de donde sacaste que con "*args" podrías... esto se hace así

Código
  1. import sys
  2.  
  3. print "se recibieron", len(sys.argv), "argumentos"
  4.  
  5. print "los argumentos recibidos fueron"
  6. for i in sys.argv:
  7.  print i
  8.  


Título: Re: cmd ejecucion def con *args
Publicado por: winnipu en 20 Abril 2016, 00:09 am
Creo que lo he solucionado mejorando el codigo y ejecutandolo desde cmd ahora si que logro ver el resultado por consola y correctamente. Pego el codigo:

Código:
lista =[]

def media(lista):
sumatorio = 0
for numero in lista:
sumatorio+=int(numero)
total=sumatorio/len(lista)
return total


while True:
x = input("Introduce un numero o pulsa 0 para terminar: ")
if x == "0":
break
else:
lista.append(x)

print ("La media ponderada de los numeros introducidos es igual a:",media(lista))


Título: Re: cmd ejecucion def con *args
Publicado por: tincopasan en 20 Abril 2016, 06:31 am
veo que no me diste bola ni tampoco a engel lex
¿en tu nuevo código, dónde está el pase de argumentos para que los haga el script?
estoy aburrido y me gusta python por lo tanto modifique un poco tu código para que veas lo que es pasar argumentos:
Código
  1. import sys
  2. argu= sys.argv
  3. argu= argu[1:]
  4. lista =[]
  5. for arg in argu:
  6.    arg = int(arg)
  7.    lista.append(arg)
  8. def media(lista):
  9.    sumatorio = 0
  10.    for numero in lista:
  11.        sumatorio+=int(numero)
  12.    total=sumatorio/len(lista)
  13.    return total
  14. print ("La media ponderada de los numeros introducidos es igual a: ",media(lista))
  15.  

para ejecutarlo desde cmd ponés: python script.py  1 2 3 4 5
o sea llamás al compilador el nombre de tu script y los argumentos separados por espacios y listo.

salvo que no hayas entendido que es pasar argumentos esa es la forma en que se puede hacer.


Título: Re: cmd ejecucion def con *args
Publicado por: winnipu en 20 Abril 2016, 20:34 pm
Gracias tincopasan, busque solventar el problema de otro modo, pero tienes razon, tecnicamente lo que hacia yo no era pasar argumentos en linea de comandos, sino pedir datos por consola.
Tu codigo me ha ayudado a entender lo que decia engel lex, realmente desconocia el funcionamiento de sys.argv, solo habia leido sobre *args y *kwargs. Disculpa por mi falta de conocimientos.
Solo una duda mas cuando codeas estas lineas:
argu= sys.argv
argu= argu[1:]
Sobreentiendo que sys.argv no lista sus miembros desde la posicion 0 como las listas, sino que comienza en la posicion 1?
Voy a leer sobre sys.argv porque la verdad es que es totalmente novedoso para mi. Gracias por encauzarme del modo correcto.

Edito: Leyendo sobre el tema he visto porque usas la posicion 1 de sys.argv como si fuese el primer parametro en vez de usar el cero. Por lo que he visto el primer valor del array (sys.argv[0]) es el nombre del archivo (script.py) y a continuación, sys.argv[1] contiene el primer parámetro, en este caso por ejemplo si los argumentos introducidos son 1 2 3 4 5 6 sys.argv[1] equivaldria al string 1, sys.argv[2] al string 2 y asi sucesivamente. Gracias de veras tincopasan y engel lex por orientarme.


Título: Re: cmd ejecucion def con *args
Publicado por: engel lex en 20 Abril 2016, 21:23 pm
antes de hacer la pregunta intentaste hacer un print a sys.argv?