2015-01-15 3 views
5

Я хотел бы знать, как лучше всего отправлять данные с OCaml на Python и получать ответ от Python обратно в OCaml.Связь между OCaml и Python

Один наивный метод, который я могу представить, заключается в следующем.

1) В OCaml записывайте данные в файл (input.txt) в файловой системе.

2) В OCaml, запустить Python, который открывает input.txt и считывает данные и записывать исполнение приводят в output.txt

3) В OCaml, открытой output.txt и прочитать результат

Есть ли другие простые способы выполнения этой задачи?

Заранее спасибо.

+1

Использование файла не является хорошим подходом, так как оно создает больше проблем, а затем решает. Особенно с синхронизацией. Но вы можете использовать модуль 'mmap' в python и функцию' mmap' 'Bigarray' для сопоставления файла в память, тем самым создавая общую память между двумя разными процессами. Хотя у него также есть проблемы с синхронизацией. Поэтому я бы предложил использовать некоторые потоковые подходы, такие как трубы, сокеты и т. Д. – ivg

+0

Посмотрите поддержку amqp в python и ocaml. Это протокол обмена сообщениями, который позволяет легко обрабатывать процессы или потоки. – didierc

+0

Другие опции - это протоколы rpc: corba, com, zeroc. У каждого из них есть библиотеки (более зрелые, чем другие) для обоих языков. Но им может потребоваться немного больше обучения, чтобы заставить их работать. – didierc

ответ

2

Самый простой способ - действительно использовать файл. Вы можете избежать записи на диск с помощью named pipe; в системе * nix, поместите файл в /tmp/ в любом случае.

Еще относительно простая альтернатива - использовать сетевой сокет.

8

Это общий вопрос о том, как разговаривать между двумя программами, написанными на разных языках. На самом деле проблему следует дополнительно разделить на две отдельные подзадачи:

  1. Какой транспорт использовать? (файл, сокет и т. д.)
  2. Как сериализовать и десериализовать данные.

Первый вопрос очень общий. Вы можете использовать сокеты разных типов, каналы, общую память, библиотеку 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 и вызвать его непосредственно в качестве библиотеки. Это не очень просто, потому что это требует беспорядка со сборкой, поэтому я не рекомендую его, пока у вас не будет требований к производительности.

1

Вы можете использовать PyCaml. Он позволяет вам упаковывать OCaml-код в качестве расширения python (вызываемый из Python) и наоборот, поэтому вы можете вызывать код Python из OCAML.

Смежные вопросы