Foros del Web » Programando para Internet » Python »

subprocess

Estas en el tema de subprocess en el foro de Python en Foros del Web. Dependiendo del comando que ingrese anda o no y en el segundo caso se queda tildado el editor sin tirar error alguno.. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código ...
  #1 (permalink)  
Antiguo 13/09/2012, 09:59
 
Fecha de Ingreso: septiembre-2012
Mensajes: 3
Antigüedad: 12 años, 3 meses
Puntos: 0
Pregunta subprocess

Dependiendo del comando que ingrese anda o no y en el segundo caso se queda tildado el editor sin tirar error alguno..

Código python:
Ver original
  1. [CODE]from subprocess import Popen, PIPE, STDOUT
  2.  
  3.  
  4. p = Popen('ping  -c 1 127.0.0.1', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
  5.  
  6. output = p.stdout.read()
  7. print output

Y la salida de esto es la siguiente :

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_req=1 ttl=64 time=0.042 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.042/0.042/0.042/0.000 ms


La salida es justamente la que quiero pero ahora al ejecutar otro comando se queda tildado el gedit.El codigo es el siguiente:el cual es el servidor de trafico de iperf
Código python:
Ver original
  1. from subprocess import Popen, PIPE, STDOUT
  2.  
  3.  
  4. p = Popen('iperf -u -s -p 5003', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
  5.  
  6. output = p.stdout.read()
  7. print output

La salida tendria que ser la siguiente :
------------------------------------------------------------
Server listening on UDP port 5003
Receiving 1470 byte datagrams
UDP buffer size: 124 KByte (default)
------------------------------------------------------------
[ 3] local 127.0.0.1 port 5003 connected with 127.0.0.1 port 44871
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 3] 0.0- 3.0 sec 384 KBytes 1.05 Mbits/sec 0.002 ms 0/ 7026 (0%)
[ 3] 0.0- 3.0 sec 1 datagrams received out-of-order


Para generar trafico en el cliente se utiliza
"iperf -u -c 127.0.0.1 -l 56 -i 1 -p 5003 -t 3"

Algunas ideas ? ..
  #2 (permalink)  
Antiguo 13/09/2012, 10:35
Avatar de mcun  
Fecha de Ingreso: octubre-2010
Ubicación: tras la pantalla
Mensajes: 466
Antigüedad: 14 años, 2 meses
Puntos: 55
Respuesta: subprocess

y que dice la salida de stderr
  #3 (permalink)  
Antiguo 13/09/2012, 11:38
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: subprocess

1.- Como ya dijo mcum checar que dice el stderr.
2.- Hacerle un flush al stdout antes de leerlo para forzar el buffer.
3.- Te recomiendo usar envoy para manejar procesos es mas fácil de usar.
  #4 (permalink)  
Antiguo 14/09/2012, 11:49
 
Fecha de Ingreso: septiembre-2012
Mensajes: 3
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: subprocess

El codigo es el siguiente,lo que no logro es imprimir la salida de la consola:


Código Python:
Ver original
  1. from threading import Timer
  2. from subprocess import Popen, PIPE, STDOUT
  3.  
  4. def kill_proc():
  5.     proc.kill()
  6.  
  7. proc = Popen("iperf -u -s -p 5003", shell=True,stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
  8.  
  9. t = Timer(30, kill_proc)
  10. t.start()
  11. proc.wait()
  12. print stdout
  13. print stdin
  14. print stderr
  15. output1 = proc.stdout.read()
  16. print output1

El error es el siguiente:

Traceback (most recent call last):
File "rtt5.py", line 12, in <module>
print stdout
NameError: name 'stdout' is not defined


el mismo error para stderr..


Usando envoy como dice razpitia.. para un ping normal logro capturar la salida pero a la hora de ejecutar el siguiente codigo:
Código Python:
Ver original
  1. # -*- coding: utf-8 -*-
  2.  
  3. """
  4. envoy.core
  5. ~~~~~~~~~~
  6.  
  7. This module provides envoy awesomeness.
  8. """
  9.  
  10. import os
  11. import sys
  12. import shlex
  13. import signal
  14. import subprocess
  15. import threading
  16.  
  17. import envoy
  18. r=envoy.run('iperf -u -s -p 5003')
  19. r.status_code
  20. r.history
  21. print r.std_out

Me da el siguiente error:


^CTraceback (most recent call last):
File "ppp.py", line 18, in <module>
r=envoy.run('iperf -u -s -p 5003')
File "/home/pepito/Escritorio/envoy.py", line 209, in run
out, err = cmd.run(data, timeout, kill_timeout, env, cwd)
File "/home/pepito/Escritorio/envoy.py", line 87, in run
thread.join(timeout)
File "/usr/lib/python2.7/threading.py", line 664, in join
self.__block.wait()
File "/usr/lib/python2.7/threading.py", line 244, in wait
waiter.acquire()
KeyboardInterrupt


Última edición por emanuelabsch; 14/09/2012 a las 12:17
  #5 (permalink)  
Antiguo 14/09/2012, 12:50
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: subprocess

El error es evidente, la variable stdout no esta definido, tampoco stdin ni stderr.

Ademas stdout.read() no va a funcionar hasta que termine el proceso a menos que le des un tamaño a leer.

Aquí un ejemplo funcional:
Código Python:
Ver original
  1. from subprocess import Popen, PIPE, STDOUT
  2.  
  3.  
  4. p = Popen('iperf -u -s -p 5003', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
  5.  
  6. buffer = ""
  7. while True:
  8.     output = p.stdout.read(1)
  9.     if output == '\n':
  10.         print buffer
  11.         buffer = ""
  12.     else:
  13.         buffer += output

Ejecutas ese script y después ejecutas este comando:
Código:
iperf -u -c 127.0.0.1 -l 56 -i 1 -p 5003 -t 3
  #6 (permalink)  
Antiguo 15/09/2012, 12:43
 
Fecha de Ingreso: septiembre-2012
Mensajes: 3
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: subprocess

Muchas gracias razpeitia

Última edición por emanuelabsch; 15/09/2012 a las 13:08

Etiquetas: gui
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:00.