programmers - python developer
interfaz erlang a python (1)
En un nivel bajo (desde el punto de vista de la programación), siempre envía / recibe solo un grupo de bytes a través de diferentes interfaces externas (tuberías, red, archivos ...) independientemente de un lenguaje de programación que esté utilizando. Por ejemplo, cuando trabajas con pipes (que llamas a open_port / 2 ) envías / recibes datos como una secuencia de bytes.
Para enviar información útil a través de una transmisión, debe dividirla en fragmentos que generalmente nombran mensajes. El formato del mensaje define cómo se pueden extraer los mensajes de una secuencia de bytes. Por ejemplo, utilizando la codificación Tipo-Longitud-Valor (TLV) puede enviar valores de diferente longitud marcados con un tipo.
En ErlPort todo funciona de la siguiente manera:
- Cuando llame a open_port / 2 , debe agregar la opción
{packet, N}
para que todos los mensajes binarios enviados a través de este puerto vayan precedidos por su longitud, enviados en N bytes (codificación Length-Value). - Antes de enviar un término al puerto, debe usar la función term_to_binary / 1 , que codifica el término de Erlang en un grupo de bytes utilizando el formato de término externo Erlang .
- En Python, al crear una instancia de la clase erlproto.Port , debe pasar el mismo valor de
packet
medida que pasa a open_port / 2 (packet=1
de forma predeterminada). - El método Port.read primero lee la longitud del mensaje de la transmisión y luego el cuerpo del mensaje.
- El cuerpo del mensaje decodificado por la función erlterms.decode .
- Cuando envía una respuesta usando el método Port.write , primero se codifica al formato de término externo de Erlang mediante la función erlterms.encode .
- Luego, el fragmento codificado precedido por su longitud se envió a Erlang.
- En el lado de Erlang, binary_to_term / 1 se usa para decodificar los datos.
He estado expandiendo la versión de Python del clásico ejemplo de interfaces de Armstrong. Todo funciona bien mientras comunico bytes. Pero, me gustaría comunicar enteros largos y flotadores. Mabye incluso (oh, no) cuerdas. Aquí está mi código: http://pastebin.com/epxgDmvu http://pastebin.com/rD7CWRkz
En primer lugar, todo lo que sé cómo enviar son bytes. ¿Puede erlang enviar algo más a su interfaz? ¿O debo convertir float a la lista de bytes, enviarlo a python y luego ensamblarlo para que flote en python?
Y, por otro lado, si empaco con el formato ''f'', erlang lo reconoce como una lista de bytes. ¿Hay alguna manera de persuadir a erlang para que tome esos bytes como un único flotante? Si no, ¿dónde puedo encontrar la forma de convertir esa lista de erlang en flotante erlang?
En caso de que erlang pueda comunicar solo bytes, ¿cómo propone que envíe una lista de enteros? Si convierto enteros en listas de bytes, no puedo enviarlos en un solo mensaje ya que el receptor no sabrá dónde termina un entero y comienza otro, ¿no? ¿Debo enviar enteros uno por uno?
Sí, estoy investigando ErlPort, py-interface y algunos otros, pero me gustaría comenzar desde los fundamentos.
Saludos, dijxtra