Flavio, voy a probar lo que me compartes.

Por el momento estoy ejecutando el script con con os.system que funciono
sin problemas.


Estaré comentando.

2015-05-05 11:12 GMT-05:00 Flavio Danesse <fdane...@gmail.com>:

> 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 <pych...@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.hernan...@gmail.com>
>> Fecha: 4 de mayo de 2015, 4:50
>> Asunto: Re: [Python-es] Modulo subprocess y Script Perl
>> Para: p...@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 <pych...@gmail.com>:
>>
>>
>>>
>>> El 3 de mayo de 2015, 22:07, Juan Camilo Hernandez Diaz <
>>> camilo.hernan...@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 <pych...@gmail.com>:
>>>>
>>>>>
>>>>>
>>>>> El 3 de mayo de 2015, 18:56, Juan Camilo Hernandez Diaz <
>>>>> camilo.hernan...@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@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@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@python.org
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es@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@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a