[Python-es] Fwd: Modulo subprocess y Script Perl

Flavio Danesse fdanesse en gmail.com
Mar Mayo 5 18:12:25 CEST 2015


Te paso parte del código de una aplicación mía.
Es un reproductor de audio video y streaming que tiene una interfaz gtk
pero utiliza mplayer en modo esclavo para reproducir.
Lo que hace es usar un mplayer precompilado con todos los plugins como
reproductor. Eso lo accede a través de subpreocess.

    def play_archivo(self, direccion):

        ejecutable_cache_pantalla = "%s -cache %i -wid %i" % (
            self.ejecutable, 1024, self.id_pantalla)

        estructura = "%s -slave -idle -nolirc -rtc -nomouseinput
-noconsolecontrols -nojoystick" % (ejecutable_cache_pantalla)

        self.mplayer = subprocess.Popen(
            estructura, shell=True, stdin=subprocess.PIPE,
            stdout=open(STDOUT, "w+b"),
            stderr=open(STDOUT, "r+b"),
            universal_newlines=True)

        self.entrada = self.mplayer.stdin
        self.salida = open(STDOUT, "r")
        self.entrada.write("loadfile %s 0\n" % direccion)
        self.entrada.flush()

Como verás, creo stdout y stderr como archivos para poder leer cada cierto
tiempo lo que va tirando mplayer.
stdin es un pipe al subproceso donde puedo escribir cuando quiera para
poder pasarle las opciones que soporta mplayer en modo sclavo. Igual, en
primera instancia no es importante nada de eso para lo que tu quieres
hacer, solo te lo explico para aclararte mejor el codigo. El tema es que no
debes usar comunicate por que no funciona, usa subprocess.Popen y pasale
como primer parámetro lo que quieres ejecutar tomando en cuenta el detalle
de que por ejemplo: si es un compilado que tienes en el directorio local
como es el caso de este ejemplo, el ejecutable debes indicarlo como
"./mplayer", si pones solo "mplayer", lo va a buscar al path del sistema y
no ejecutará el que tienes en que tienes en tu directorio.

El 4 de mayo de 2015, 10:10, Chema Cortes <pych3m4 en gmail.com> escribió:

> [[reenvio de nuevo el mensaje a la lista]]
>
> Lo del os.path.join es un modo de hacerlo más "portable", si lo
> necesitaras:
>
> par   =   os.path.join(os.getcwd(), fname)
>
> o más directo
>
> par = os.path.abspath(fname)
>
>
> Seguramente que el script de perl esté lanzando sus propios PIPEs. Prueba
> a ejecutarlo con shell=True
>
>
>
> ---------- Mensaje reenviado ----------
> De: Juan Camilo Hernandez Diaz <camilo.hernandez en gmail.com>
> Fecha: 4 de mayo de 2015, 4:50
> Asunto: Re: [Python-es] Modulo subprocess y Script Perl
> Para: py en ch3m4.org
>
>
> ​Chema.
>
> Te cuento he probado la opcion del  time.sleep(60)​ y el problema
> persiste, también verifique con el env del bash y cuando es ejecutado
> muestra el mismo entorno.
>
>
> El os.path.join  nunca lo he trabajado, me podrias ayudar con un ejemplo
> para ver que pasa?
>
> 2015-05-03 18:46 GMT-05:00 Chema Cortes <pych3m4 en gmail.com>:
>
>
>>
>> El 3 de mayo de 2015, 22:07, Juan Camilo Hernandez Diaz <
>> camilo.hernandez en gmail.com> escribió:
>>
>>> Gracias por tu respuesta.
>>>
>>> Mira como estoy pasando los datos:
>>>
>>> *cmd     =   "/opt/tools/RT_reformat.pl"*
>>> *par     =   "{0}/{1}".format(os.getcwd(), fname)*
>>> *cmd_exe =   subprocess.Popen([cmd, par], shell=False,
>>> stdout=subprocess.PIPE, stderr=subprocess.PIPE)*
>>> *stdout, stderr = cmd_exe.communicate()*
>>> *print stdout, stderr*
>>>
>>> tambien probe con:
>>> cmd = *"/opt/tools/RT_reformat.pl **{0}/{1}".format(os.getcwd(),
>>> fname), eliminando logicamente lo referente a la variable par-*
>>>
>>> la variable *par* hace referencia a un archivo de texto (Sensor.
>>> 2015022300) plano que contiene un listado de sensores y valores de
>>> temperatura, la salida del comando es un archivo en texto plano con un
>>> formato especifico ¿Estoy haciendo algo mal?
>>>
>>
>> Está correcto (aunque mejor usar os.path.join para la ruta del fichero)
>>
>> Intuyo que hay una mala comunicación entre el script de perl y python.
>> Parece como que el código python acabe antes de que el script de perl haya
>> procesado todo el fichero. Precisamente, communicate debería esperar hasta
>> que el subproceso acabe, pero puede que el script de perl se dedique a
>> lanzar otros procesos que python no ve.
>>
>> Prueba a poner una espera (time.sleep()) antes de communicate a ver si
>> termina bien.
>>
>>
>>
>>
>>>
>>>
>>> 2015-05-03 14:31 GMT-05:00 Chema Cortes <pych3m4 en gmail.com>:
>>>
>>>>
>>>>
>>>> El 3 de mayo de 2015, 18:56, Juan Camilo Hernandez Diaz <
>>>> camilo.hernandez en gmail.com> escribió:
>>>>
>>>>> Un saludo a todos.
>>>>>
>>>>> Tengo la necesidad de ejecutar un script en perl, el cual es provisto
>>>>> por un tercero; este básicamente efectúa una consulta y genera un archivo
>>>>> en un formato especifico.
>>>>>
>>>>> He programado una función en python que se encarga de ejecutar este
>>>>> archivo, y continuar la ejecución de las demás tareas. Sin embargo, este no
>>>>> se ejecuta como es debido (no genera el archivo de salida)
>>>>>
>>>>> Hasta el momento he probado con os.system, subsystem.call y
>>>>> subsystem.Popen, todos con el mismo resultado:
>>>>>
>>>>
>>>> Entiendo que por "subsystem" te refieres a "subprocess"
>>>>
>>>>
>>>>>
>>>>> *substr outside of string at /opt/tools/RT_reformat.pl line 77, <IN>
>>>>> line 15729*
>>>>>
>>>>> Igualmente, trate de generar un bash script que fuera llamado desde mi
>>>>> script python y ejecutara el modulo en perl; igual resultado.
>>>>>
>>>>> Cuando ejecuto el script directamente en bash funciona sin problemas y
>>>>> genera los archivos requeridos ¿Alguna sugerencia de como superar esto?
>>>>>
>>>>>
>>>>
>>>> Por el error, parece que el script de perl no encuentra nada en el
>>>> stream de entrada <IN>. Cuando dices que el script "efectúa una consulta",
>>>> probablemente espera encontrar algo que deberías suministrar. Tal vez, pida
>>>> que le introduzcas un dato o simplemente pulsar una tecla para continuar.
>>>> Por defecto, el proceso que lanza python no tiene ninguna entrada de datos.
>>>>
>>>> Puede que la documentación te ayude:
>>>>
>>>> https://docs.python.org/2/library/subprocess.html#replacing-older-functions-with-the-subprocess-module
>>>>
>>>>
>>>> --
>>>> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
>>>> http://ch3m4.org/blog
>>>> Buscador Python Hispano: http://ch3m4.org/python-es
>>>>
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> Python-es en python.org
>>>> https://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>>>
>>>
>>>
>>> --
>>> JUAN CAMILO HERNÁNDEZ DÍAZ
>>>
>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> https://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>>
>>>
>>
>>
>> --
>> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
>> http://ch3m4.org/blog
>> Buscador Python Hispano: http://ch3m4.org/python-es
>>
>
>
>
> --
> JUAN CAMILO HERNÁNDEZ DÍAZ
>
>
>
>
> --
> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
> http://ch3m4.org/blog
> Buscador Python Hispano: http://ch3m4.org/python-es
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20150505/29c2fffe/attachment.html>


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