0

OTP in Actionの本とCesariniの本の第12章に基づいて、私はこのErlangコードを作成しました。

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シェルからPythonをチェックしました。これにより、すべてのユーザー入力が出力されます(1-「Pythongot1」)。

ここの間違いはどこにありますか?なぜ私のErlangコードは何も戻らないのですか?

4

2 に答える 2

1

ParamにはPython用のコマンドリミッターが含まれていますか?(この場合、改行「\ n」を想定しています)。また、list_to_binary / 1、次にterm_to_binary/1はちょっと間違っているように感じます。term_to_binary / 1(改行を含む)で十分です。

于 2011-10-13T17:04:14.917 に答える
1

次の 2 つのポイントがあります。

  • Python が出力をバッファリングしないことを確認してくださいpython -uopen_port
  • Python がErlang External Term Formatをエンコード/デコードできると想定しているため、これらを使用するterm_to_binary/1と機能しませんが、そうではないようです。このルートに行きたい場合は、ErlPortをチェックしてくださいbinary_to_term/1
于 2011-10-14T06:21:27.580 に答える