Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Python agente no foncionando [SOLVED]
#1
Hola buenos dias

en mi servidor Pandora (server = agente) modificando /etc/pandora/pandora_agente.conf consigo ejecutar varios scripts de tipo SH pero a mi grande surpresa no consigo hacer lo mismo con un script PYTHON, tan simple como devolver un valor.<br>module_begin<br>module_name Camara<br>module_type generic_data<br>module_exec /u/camara.py<br>module_end<br>donde camara.py es "solamente" esto :
#!/usr/bin/env python
from sys import argv, exit
import sys
def main():
 return str(100.00)
if __name__ == '__main__':
sys.exit(main())

<br>El problema no viene de las autorisaciones de los ficheros. Hay otra cosa que puedo comprobar?
 Reply
#2
Buenas tardes, richfre.

Tu problema es tan simple como que usando la función str estás convirtiendo dicho dato numérico en un string, de modo que si defines un módulo de tipo generic_data, dicho módulo será incapaz de procesar la salida de tu script, ya que lo considerará un string en vez de un dato de valor numérico.

Para este problema hay dos soluciones:

1) Si realmente quieres considerar dicho valor como un string, la estructura del módulo debe ser:

Code:
module_begin
module_name Camara
module_type generic_data_string
module_exec /u/camara.py
module_end

2) Si necesitas que Pandora server interprete el valor como numérico, la salida de tu script debe ser un valor numérico, no un string, y para ello no puedes hacer uso de la función str.

Puedes intentar esto:

#!/usr/bin/env python
from sys import argv, exit
import sys
def main():
 return float(100.00)
if __name__ == '__main__':
sys.exit(main())


Para que te devuelva el dato en formato numérico y no como un string.

En este caso, el campo "module_type" sí sería "generic_data".

Espero que te haya servido de ayuda.

Saludos.
 Reply
#3
He estado comprobando más a fondo tu problema y parece que nos encontramos con una especie de problema adicional:

Mientras que tu script devuelve 100.0 a la salida por línea de comandos, parece que a la hora de que el agente de Pandora parsee la salida de la ejecución de ese módulo a XML ocurre algo que provoca que el XML correspondiente a ese módulo no contenga ningún dato o hace que directamente no se cree...

Esto puede ser debido a que al incluir "import sys" y hacer referencia a "sys.exit(main())" se genere una especie de conflicto entre el módulo que dicha línea incluye y el módulo que crea el agente de Pandora para enviar al servidor.

He llegado a esta conclusión debido a que un simple código que contenga:

Code:
#!/usr/bin/python
def main():
 return float(100.00)
print main()

Incluído en pandora_agent.conf como:

Code:
module_begin
module_name Camara
module_type generic_data
module_exec /u/camara.py
module_end

Devuelve el mismo valor y sí es procesado correctamente por el servidor de Pandora, el cual muestra el nuevo módulo en la consola.

Para arreglar este problema puedes o bien usar este código o bien encontrar otra manera de mostrar esa salida evitando hacer uso de sys.exit(main())

Es un problema poco frecuente, pero bastante grave a la hora de querer implementar módulos o plugins Python... de modo que lo reportaré a la lista de bugs para ver que se puede hacer para corregir esto.

Muchas gracias por hacernos llegar tu consulta.

Un saludo.
 Reply
#4
Gracias por tú respuesta.
El problema que veo es que obviamente el scribt python que quiero implementar es más importante con varios include y comunicaciones.
Intentaré quitar el último str, pero voy a necesitar otros includes que no podré prescindir.
El lunes Lo probare
Buen fin de semana, y otra vez gracias
 Reply
#5
Buenos dias

respondo a mi propria duda. La solucion dado por TPALACIOS es valida, pero quiero añadir algunos comentarios (por si a caso otra persona tiene un problema similar)
  - el script python puede devolver el numero en forma de STR, del momento que sea un numero Pandora lo interprete bien.
  - Pandora admite el uso de IMPORT (system, o otros)
  - A Pandora "no le gusta"
            if __name__ == '__main__':
              sys.exit(main())
   
  La solucion print main(), es la adecuada
Gracias a TPalacios por su ayuda
 Reply
#6
Me temo que la solución no es del todo precisa, richfre. ;-)

He estado indagando y haciendo pruebas adicionales hemos descubierto el verdadero problema de tu script:

El problema radica en que a la hora de interpretar los datos, Pandora los recoge todos los datos mediante la salida estándar stdout.

Si haces que el script devuelva el dato mediante un return en vez de mediante un print, Pandora no recogerá ningún dato.

He llegado a esta conclusión debido a que un script igual al tuyo pero sustituyendo return por print funciona, incluso con las líneas:

Code:
if __name__ == '__main__':
    sys.exit(main())

Por eso tanto:

Code:
#!/usr/bin/python
def main():
 return float(100.00)
print main()

Code:
#!/usr/bin/env python
from sys import argv, exit
import sys

def main():
    print(float(100.00))

if __name__ == '__main__':
    sys.exit(main())

Mi solución aportaba dicho return, pero al final recogía el dato mediante un print, con lo que funcionaba igualmente.

No hay ningún problema con los imports.

Un saludo. Wink
 Reply
#7
Gracias
 Reply


Users browsing this thread: 1 Guest(s)


(c) 2006-2018 Artica Soluciones Tecnológicas. Contents of this wiki are under Create Common Attribution v3 licence. | pandorafms.com | pandorafms.org

Theme © MyBB Themes