2015-01-15 14 views
5

Tôi muốn biết cách tốt nhất để gửi dữ liệu từ OCaml tới Python và nhận phản hồi từ Python trở lại OCaml.Giao tiếp giữa OCaml và Python

Một phương pháp ngây thơ tôi có thể nghĩ là như sau.

1) Trong OCaml, ghi dữ liệu vào tệp (input.txt) trên hệ thống tệp.

2) Trong OCaml, chạy python, mà mở INPUT.TXT và đọc dữ liệu và viết thực hiện kết quả vào output.txt

3) Trong OCaml, output.txt mở và đọc kết quả

Có cách nào khác dễ dàng để thực hiện loại nhiệm vụ này không?

Xin cảm ơn trước.

+1

sử dụng tệp không phải là một cách tiếp cận tốt, vì nó tạo ra nhiều vấn đề hơn, sau đó giải quyết. Đặc biệt là với đồng bộ hóa. Nhưng bạn có thể sử dụng mô-đun 'mmap' trong python và' '' '' 'của' Bigarray' để ánh xạ tệp vào bộ nhớ, do đó tạo bộ nhớ dùng chung giữa hai quy trình khác nhau. Mặc dù, nó cũng có vấn đề với đồng bộ hóa. Vì vậy, tôi sẽ đề nghị sử dụng một số phương pháp tiếp cận dòng, như đường ống, ổ cắm, vv – ivg

+0

Có một cái nhìn tại hỗ trợ amqp trong python và ocaml. Đó là một giao thức nhắn tin cho phép các quy trình hoặc chủ đề giao tiếp dễ dàng. – didierc

+0

Các tùy chọn khác là rpc như giao thức: corba, com, zeroc. Mỗi trong số này có các thư viện (một số trưởng thành hơn các thư viện khác) cho cả hai ngôn ngữ. Nhưng họ có thể yêu cầu học thêm một chút để họ có thể làm việc. – didierc

Trả lời

2

Cách đơn giản nhất thực sự là sử dụng tệp. Bạn có thể tránh ghi vào đĩa bằng cách sử dụng named pipe; trên hệ thống * nix, hãy đặt tệp trong /tmp/.

Một lựa chọn tương đối đơn giản là sử dụng ổ cắm mạng.

8

Đây là câu hỏi chung về cách nói chuyện giữa hai chương trình, được viết bằng các ngôn ngữ khác nhau. Trên thực tế, sự cố phải được chia nhỏ thành hai biểu mẫu con riêng biệt:

  1. Giao thông vận tải nào để sử dụng? (tệp, ổ cắm, v.v.)
  2. Cách tuần tự hóa và deserialize dữ liệu.

Câu hỏi đầu tiên là rất chung chung. Bạn có thể sử dụng ổ cắm của các loại khác nhau, đường ống, bộ nhớ chia sẻ, thư viện zmq, hoặc bất cứ điều gì. Thật khó để đưa ra lời khuyên nào ở đây, vì mọi sự lựa chọn đều có khuyết điểm và ưu điểm của họ. Có thể sử dụng http trên TCP ổ cắm không phải là lựa chọn không tốt vì chúng có mặt khắp mọi nơi và có thư viện tuyệt vời ở cả hai bên của đường ống. Cách tiếp cận khác là sử dụng đường ống và gọi một hoặc một phần khác bằng cách sử dụng popen cuộc gọi hệ thống, điều này sẽ tạo ra một quy trình cho bạn và trả lại các đường ống mà bạn có thể đọc hoặc viết. Là một phần mở rộng của phần trước, bạn thậm chí có thể sử dụng python làm thư viện và gọi trực tiếp cho trình thông dịch từ chương trình ocaml của bạn, chuyển các chuỗi bằng mã. Tùy thuộc vào nhiệm vụ của bạn, nó có thể phù hợp hay không.

Câu hỏi thứ hai, là cách sắp xếp lại kiểu gốc OCaml, như int thành byte và sau đó đọc byte này dưới dạng python native int và ngược lại. Có một số giải pháp ở đây, không quá nhiều. Bạn có thể sử dụng json với thư viện ezjsonm trên OCaml (trên trăn có json), bạn có thể sử dụng cap'n'proto nó có các ràng buộc trong OCaml và Python. Ngoài ra, còn có bộ đệm Giao thức Google nổi tiếng, còn gọi là protobufs, với một số liên kết trong OCaml, bao gồm thư viện piqi, cũng có thể tuần tự hóa thành nhiều định dạng.

Có một cách tiếp cận khác, bạn có thể làm cho chương trình OCaml trở thành thư viện năng động hiển thị giao diện trong C, sau đó tạo mô-đun python và gọi trực tiếp dưới dạng thư viện. Điều này không phải là rất dễ dàng, bởi vì nó đòi hỏi phải mess với xây dựng hệ thống, vì vậy tôi không khuyên bạn nên nó cho đến khi bạn có yêu cầu hiệu suất.

1

Bạn có thể sử dụng PyCaml. Nó cho phép bạn đóng gói mã OCaml như là một phần mở rộng python (có thể gọi từ Python) và ngược lại, vì vậy bạn có thể gọi mã Python từ OCAML.

Các vấn đề liên quan