0

根据 OTP in Action 书的第 12 章和 Cesarini 的书,我编写了这个 Erlang 代码:

二郎:

p(Param) ->

    ?DBG("Starting~n", []),

    Cmd = "python test.py",

    Port = open_port({spawn,Cmd}, [stream,{line, 1024},  exit_status]),
    ?DBG("Opened the port: ~w~n", [Port]),

    Payload = term_to_binary(list_to_binary(integer_to_list(Param))),
    erlang:port_command(Port, Payload),

    ?DBG("Sent command to port: ~w~n", [Payload]),
    ?DBG("Ready to receive results for command: ~w~n", [Payload]),

    receive
        {Port, {data, Data}} ->
            ?DBG("Received data: ~w~n", [Data]),
            {result, Text} = binary_to_term(Data),
            Blah = binary_to_list(Text),
            io:format("~p~n", [Blah]);
        Other ->
            io:format("Unexpected data: ~p~n", [Other])

    end.

Python:

import sys
def main():
    while True:
        line = sys.stdin.readline().strip()
        if line == "stop-good":
                return 0
        elif line == "stop-bad":
                return 1
        sys.stdout.write("Python got ")
        sys.stdout.write(line)
        sys.stdout.write("\n")
        sys.stdout.flush()
if __name__ == "__main__":
 sys.exit(main())

Erlang 代码在 recieve 子句处暂停 - 它永远不会收到任何消息。

我还从常规 Linux shell 检查了 Python - 它打印出每个用户输入(1 - “Python got 1”)。

这里的错误在哪里?为什么我的 Erlang 代码没有得到任何回报?

4

2 回答 2

1

您的参数是否包含 Python 的命令限制器?(在这种情况下,我假设换行符“\n”)。此外, list_to_binary/1 然后是 term_to_binary/1 感觉有点不对劲。term_to_binary/1 直接(包括换行符)就足够了。

于 2011-10-13T17:04:14.917 回答
1

有两点:

  • 确保 Python 不缓冲您的输出,尝试python -u运行open_port
  • using term_to_binary/1and binary_to_term/1won't work,因为他们假设 Python 能够编码/解码Erlang External Term Format,但似乎并非如此。如果你想走这条路,请查看ErlPort
于 2011-10-14T06:21:27.580 回答