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:
- Che tipo di trasporto utilizzare? (file, socket, ecc.)
- 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.
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
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
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