Это общий вопрос о том, как разговаривать между двумя программами, написанными на разных языках. На самом деле проблему следует дополнительно разделить на две отдельные подзадачи:
- Какой транспорт использовать? (файл, сокет и т. д.)
- Как сериализовать и десериализовать данные.
Первый вопрос очень общий. Вы можете использовать сокеты разных типов, каналы, общую память, библиотеку zmq или что угодно. Трудно дать какой-либо совет здесь, поскольку у всех вариантов есть свои минусы и плюсы. Возможно, использование http
над TCP
сокет - неплохой выбор, так как они вездесущие, и там есть прекрасные библиотеки по обе стороны трубы. Другой подход - использовать каналы и вызывать ту или иную часть, используя системный вызов popen
, который будет создавать процесс для вас и возвращать каналы, с которых вы можете читать или писать. Как расширение предыдущего, вы можете даже использовать python
в качестве библиотеки и вызывать интерпретатор непосредственно из вашей программы ocaml, передавая строки с кодом. В зависимости от вашей задачи он может быть подходящим или нет.
Второй вопрос: о том, как сериализовать родной тип OCaml, например int
, в байты, а затем читать эти байты как родные python int
и наоборот. Здесь есть некоторые решения, но не так много. Вы можете использовать json
с библиотекой ezjsonm
на OCaml (на python есть json
), вы можете использовать cap'n'proto
, у него есть привязки в OCaml и Python. Кроме того, существуют известные буферы протокола Google, например протобуфы, с несколькими связями в OCaml, включая библиотеку piqi
, которая также может быть сериализована во многих форматах.
Существует еще один подход, вы можете сделать программу OCaml динамической библиотекой, отображающей интерфейс в C
, а затем создать модуль python и вызвать его непосредственно в качестве библиотеки. Это не очень просто, потому что это требует беспорядка со сборкой, поэтому я не рекомендую его, пока у вас не будет требований к производительности.
Использование файла не является хорошим подходом, так как оно создает больше проблем, а затем решает. Особенно с синхронизацией. Но вы можете использовать модуль 'mmap' в python и функцию' mmap' 'Bigarray' для сопоставления файла в память, тем самым создавая общую память между двумя разными процессами. Хотя у него также есть проблемы с синхронизацией. Поэтому я бы предложил использовать некоторые потоковые подходы, такие как трубы, сокеты и т. Д. – ivg
Посмотрите поддержку amqp в python и ocaml. Это протокол обмена сообщениями, который позволяет легко обрабатывать процессы или потоки. – didierc
Другие опции - это протоколы rpc: corba, com, zeroc. У каждого из них есть библиотеки (более зрелые, чем другие) для обоих языков. Но им может потребоваться немного больше обучения, чтобы заставить их работать. – didierc