【发布时间】:2016-10-14 18:18:34
【问题描述】:
我正在尝试学习如何通过 Elixir 与 porcelain module 进行互操作。
所以我做了这个简单的例子:
我有一个 Elixir 函数,如下所示:
defmodule PythonMessenger do
alias Porcelain.Process, as: Proc
alias Porcelain.Result
def test_messages do
proc = %Proc{pid: pid} =
Porcelain.spawn_shell("python ./python_scripts/reply_to_elixir.py",
in: :receive, out: {:send, self()})
Proc.send_input(proc, "Greetings from Elixir\n")
data = receive do
{^pid, :data, :out, data} -> data
end
IO.inspect data
Proc.send_input(proc, "Elixir: I heard you said \"#{data}\"\n")
data = receive do
{^pid, :data, data} -> data
end
IO.inspect data
Proc.send_input(proc, "Please quit\n")
data = receive do
{^pid, :data, data} -> data
end
IO.inspect data
end
end
还有一个看起来像这样的python脚本:
import sys
while 1:
line = sys.stdin.readline()
if "quit" in line:
print("Quitting, bye for now")
sys.exit()
print(line)
但这不起作用。 python 脚本永远不会退出。 如果只读取一行:
line = sys.stdin.readline()
效果很好。
那么问题出在哪里,有什么想法吗?
【问题讨论】:
-
本身不是答案,但您可能还想查看 Erlang 的外部术语格式。有关该主题的更多信息,请参阅此问答:stackoverflow.com/questions/5050758/erlang-interface-to-python
-
还有 erlports 包,它允许您来回发送术语,而不仅仅是字符串。 erlport.org
-
谢谢,erlport 似乎比瓷器更好。