Sigue: Paso de comandos a un programa desde Python

Tomás Javier Robles Prado tjavier en usuarios.retecal.es
Mie Sep 11 00:11:57 CEST 2002


Gracias por vuestra ayuda! , ya pensaba que tenía que hacerlo en C 
(brrrrrrrrr)

Aquí os posteo el código que escribí gracias a vuestras sugerencias. Aún no 
hace nada, pero establece una capa python entre overnet y el usuario. Ahora 
la cosa es afinar y añadir funcionalidades, pero lo que se me atragantaba 
está arreglado.

#!/usr/bin/env python2

#Control de overnet

OVERNET = "./overnet0.29.1"

import popen2
import time
import os
import stat

def fichero_nodos (ruta , entrada, salida):
    "Toma un fichero de nodos y los introduce en overnet"
    f = file (ruta, 'r')
    lineas = f.readlines()
    for linea in lineas:
        comando = linea 
        ejecuta_comando (comando,entrada,salida)
                        
def ejecuta_comando (comando, entrada,salida):
    "Ejecuta el comando dado devolviendo la salida de overnet"
    
    if os.fork():
        #Proceso Padre
        os.wait()
        return salida_datos(salida)
                                  
    else:
        #Proceso Hijo
        entrada_datos (entrada, comando)
        os._exit(0)
              
def entrada_datos (entrada, comando):
    "Introduce 'comando' en la tuber -bía" -A
    os.write (entrada.fileno(),comando)
    
def salida_datos (salida):
    "Devuelve la salida de overnet ante cierto comando"
    lin = ''
    while 1:
        cant = os.fstat(salida.fileno())[stat.ST_SIZE]
        if cant == 0:
            break
        lin = lin + salida.read(cant)

    return lin        

def modo_transparente(entrada,salida):
    "Simula el comportamiento habitual de overnet"

    comando = ''
    while comando != 'Quit\n' :
        comando = raw_input ('> ')
        comando = comando + '\n'
        print ejecuta_comando (comando,entrada,salida)
    
    print ejecuta_comando ('q\n' ,entrada,salida)
    print ejecuta_comando ('y\n' ,entrada,salida)

def main ():
    
    #Abrimos overnet
    
    salida, entrada = popen2.popen4 (OVERNET, 2048,'t')

    #Pasamos un fichero de nodos a overnet 

    fichero_nodos ('nodes.txt',entrada, salida)

    modo_transparente(entrada,salida)
    


if __name__ == '__main__':
    main()



De nuevo, gracias a todos :)

-- 
Un saludo,
T. Javier Robles Prado tjavier en usuarios.retecal.es
http://users.servicios.retecal.es/tjavier





Más información sobre la lista de distribución Python-es