假设我有Erlang“企业应用程序”:
-module(hello).
-export([start/0]).
start() ->
spawn(fun() -> loop() end).
loop() ->
receive
hello ->
io:format("Hello, World!~n"),
loop();
goodbye ->
ok
end.
有没有办法从Python代码运行它?这样我就可以得到“Hello,World!”文字回到Python? Erlport似乎在反过来工作..
编辑:换句话说,如何从Python绑定到Erlang端口?
答案 0 :(得分:6)
您正在寻找的是Py-Interface,它在Python中实现了一个与Erlang兼容的节点。
py_interface提供了创建可能的节点的可能性 用于与其他Erlang节点通信。
如果你有一个用Erlang编写的一次性命令行程序,只想执行它并捕获输出,就像使用任何其他外部可执行文件一样使用subprocess
模块。
答案 1 :(得分:3)
使用gen_tcp和套接字,Luke!
答案 2 :(得分:0)
有一个erland的python库,导入这个;-) http://erlport.org/
你好例子:
from erlport import Port, Protocol, String
# Inherit custom protocol from erlport.Protocol
class HelloProtocol(Protocol):
# Function handle_NAME will be called for incoming tuple {NAME, ...}
def handle_hello(self, name):
# String wrapper forces name to be a string instead of a list
return "Hello, %s" % String(name)
if __name__ == "__main__":
proto = HelloProtocol()
# Run protocol with port open on STDIO
proto.run(Port(use_stdio=True))
答案 3 :(得分:0)
您可以使用subprocess模块执行此操作。 这是使用该模块的基本示例:
output = Popen(["ls", "-L"], stdout=PIPE).communicate()[0]
沟通功能等待EOF,因此您无法实时与您的应用进行实时通信。
此外,pexpect模块也可以执行相同操作,并允许您与应用程序进行交互。
答案 4 :(得分:-1)
如果您需要Erlang在Python中执行某些操作,最好创建一个 escript 。然后由您的python脚本调用escript。 Erlang escript会将你想要的输出吐出你的python脚本,如果你把它们像这样管道输出:
bash-3.2$ escript Your_Erlang_script.escript | python_script.py
通过这种方式,您可以避免执行端口编程,套接字,这可能会引入开销。一个简单的escript可以做你想要的,并让python与Erlang进行很好的通信。我很久以前就使用过escripts,他们很好地使用了Bash,perl和Lua脚本。
OR
我们可以在bash上使用命令替换。 我们创建一个erlang escript或命令。命令含义如下:
erl -noshell -eval "yourModule:someFunction()" -eval "erlang:halt()" e.g. bash-3.2$ h=`erl -noshell -eval "io:format(\"Hello world\",[])" -eval "erlang:halt()"` bash-3.2$ echo $h Hello World bash-3.2$现在通过创建如上所述的命令替换,我们将调用python脚本来获取和使用erlang命令或escript outpu的输出,如下所示
bash-3.2$ python python_script.py $h