2015-01-15 27 views
5

Mi piacerebbe sapere il modo migliore per inviare dati da OCaml a Python e ottenere risposta da Python a OCaml.Comunicazione tra OCaml e Python

Un metodo ingenuo che posso pensare è il seguente.

1) In OCaml, scrivere i dati in un file (input.txt) sul file system.

2) In OCaml, pitone eseguire, che apre input.txt e legge i dati e scrivere il risultato dell'esecuzione in output.txt

3) In OCaml, output.txt aperto e leggere il risultato

Esistono altri modi semplici per eseguire questo tipo di attività?

Grazie in anticipo.

+1

l'utilizzo del file non è un buon approccio, poiché crea più problemi, quindi risolve. Soprattutto con la sincronizzazione. Ma puoi usare il modulo 'mmap' in python e la funzione' mmap' di 'Bigarray' per mappare il file in memoria, creando così una memoria condivisa tra due processi diversi. Anche se ha anche problemi con la sincronizzazione. Quindi suggerirei di utilizzare alcuni approcci di flusso, come pipe, socket, ecc. – ivg

+0

Dai un'occhiata al supporto di amqp in python e ocaml. È un protocollo di messaggistica che consente a processi o thread di comunicare facilmente. – didierc

+0

Altre opzioni sono protocolli come rpc: corba, com, zeroc. Ognuno di questi ha librerie (alcune più mature di altre) per entrambe le lingue. Ma potrebbero richiedere un po 'più di apprendimento per farli funzionare. – didierc

risposta

2

Il modo più semplice è utilizzare un file. È possibile evitare di scrivere su disco utilizzando named pipe; su un sistema * nix, inserire il file in /tmp/ comunque.

Un'alternativa ancora relativamente semplice consiste nell'utilizzare una presa di rete.

8

Questa è una domanda generale su come parlare tra due programmi, scritti in lingue diverse. In realtà, il problema dovrebbe essere ulteriormente suddiviso in due sottoproblemi separati:

  1. Che tipo di trasporto utilizzare? (file, socket, ecc.)
  2. Come serializzare e deserializzare i dati.

La prima domanda è molto generale. È possibile utilizzare socket di tipi diversi, pipe, memoria condivisa, libreria zmq o altro. È difficile dare qualche consiglio qui, dal momento che tutte le scelte hanno i loro contro e i loro pro. Forse usare http su socket TCP non è una cattiva scelta, dato che sono onnipresenti, e ci sono eccellenti librerie su entrambi i lati della pipa. Un altro approccio consiste nell'utilizzare le pipe e nel chiamare una parte o un'altra utilizzando la chiamata di sistema popen, che creerà un processo per te e restituirà pipe da cui puoi leggere o scrivere. Come estensione del precedente, puoi anche usare python come libreria e chiamare l'interprete direttamente dal tuo programma ocaml, passando le stringhe con il codice. A seconda del tuo compito, può essere adatto o meno.

La seconda domanda riguarda come serializzare il tipo nativo OCaml, come int in byte, quindi leggere questo byte come tipo nativo python int e viceversa. Ci sono alcune soluzioni qui, non così tante però. È possibile utilizzare json con la libreria ezjsonm su OCaml (su Python c'è un json), è possibile utilizzare cap'n'proto con associazioni in OCaml e Python. Inoltre, ci sono ben noti buffer di protocollo Google, noti anche come protobuf, con vari binding in OCaml, inclusa la libreria piqi, che può anche essere serializzata in molti formati.

C'è un altro approccio, è possibile rendere il programma OCaml come una libreria dinamica che espone l'interfaccia in C, quindi creare un modulo python e chiamarlo direttamente come libreria. Questo non è molto facile, perché richiede un pasticcio con il sistema di build, quindi non lo consiglio fino a quando non si hanno i requisiti di prestazione.

1

È possibile utilizzare PyCaml. Ti consente di impacchettare il codice OCaml come estensione python (callable da Python) e viceversa, quindi puoi chiamare il codice Python da OCAML.