5

我有两个问题,一个是另一个的子集。

1) 在 Python 和 Clojure 程序之间传递信息的最佳方式是什么。这个问题也可以扩展到任何 jvm 语言,如 Scala。这些程序将在 Linux 下运行。

2) 在 Windows 下执行此操作的最佳方法是什么?

详细情况如下。我想要一个 Python 程序来启动一个 Clojure 程序,知道 Clojure 程序何时完成,并检索运行 Clojure 程序的结果。

我知道在 Python 和 Clojure 程序之间,信息可以在一个数据库表中共享,该数据库表专门用于在 Clojure 程序完成时存储信息,或者甚至做一些笨拙的事情,比如将结果文件留在已知目录中。

鉴于这是 Linux,我可能可以使用管道共享信息,但我特别想知道是否有 Python 和 Clojure 都支持的模块可以促进程序间通信。

谢谢你。

4

5 回答 5

5

我不确定您的 Clojure 程序在做什么,但如果您只是想从 Python 执行 Clojure 代码,那么 Clojure-Py 可能会有所帮助:

https://github.com/halgari/clojure-py

例如,您可以在 Python 中执行此操作:

>>> import clojure.core

>>> clojure.core.cons(1, None)
(1)

免责声明,我是clojure-py的作者

于 2012-07-25T15:33:08.343 回答
2

另一种 IPC 方法是使用套接字。我在 python 上创建了一个非常简单的套接字服务器,它接受字符串并在其上调用函数。然后,clojure 实例可以连接到 python 服务器并将 clojure 表单作为数据发送过来。使用pyclj,使用pyclj将 clojure 数据转换为 python 形式,然后对其进行处理,然后使用 pycljreader返回 clojure 数据。这种方法对 clojure 更友好,因为您一直在使用 clojure 数据。这也为 python 和 clojure 实例的运行位置提供了更大的灵活性,并为异步通信提供了更好的接口。 writer

https://github.com/sunng87/pyclj

于 2012-07-26T12:46:43.817 回答
1

If performance is important then Protocol Buffers is a good option. Using protobuf from Clojure is covered well in Protocol Buffers with Clojure and Leiningen.

于 2012-07-26T22:36:12.240 回答
0

我不熟悉 Clojure,但您可能可以使用 python子进程模块将 json 传递给它。

import json
from subprocess import Popen, PIPE

json_data = json.dumps({"key":"value"})
p = subprocess.Popen("closure-execution", stdout=PIPE, stdin=PIPE, sterr=PIPE)
# stuff some data into the pipe and wait for the process to end:
stdout, sterr = p.communicate(json_data)

或类似的东西...

于 2012-07-25T14:35:27.567 回答
0

一种选择是使用Jython在与 Clojure 相同的 JVM 中运行您的 Python 代码 - 这样互操作就会变得更加容易。

在这种情况下,互操作也应该是独立于操作系统的,这是一个很好的奖励。

看:

于 2012-07-26T07:28:01.877 回答