【发布时间】:2021-06-16 19:38:21
【问题描述】:
我正在尝试通过 Erlang 端口与外部 python 进程通信。首先打开一个端口,然后通过标准输入向外部进程发送一条消息。我期待在进程的标准输出上得到相应的回复。
我的尝试如下所示:
% open a port
Port = open_port( {spawn, "python -u -"},
[exit_status, stderr_to_stdout, {line, 1000000}] ).
% send a command to the port
true = port_command( Port, "print( \"Hello world.\" )\n" ).
% gather response
% PROBLEM: no matter how long I wait flushing will return nothing
flush().
% close port
true = port_close( Port ).
% still nothing
flush().
我意识到 someone else on Stackoverflow 试图做类似的事情,但提议的解决方案显然对我不起作用。
另外,我看到a related post on Erlang Central 正在通过 Erlang 端口启动 Python 脚本,但调用的不是 Python shell 本身。
我已经注意到ErlPort,但我有一个完整的脚本要在 Python 中执行。如果可能,我不想将脚本分解为单个 Python 调用。
够有趣的,用 bash 来做是没问题的:
Port = open_port( {spawn, "bash"},
[exit_status, stderr_to_stdout, {line, 1000000}] ).
true = port_command( Port, "echo \"Hello world.\"\n" ).
所以上面的例子给了我一个“Hello world”。冲洗时:
3> flush().
Shell got {#Port<0.544>,{data,{eol,"Hello world."}}}
ok
正是我想看到的。
- Ubuntu 15.04 64 位
- 二郎18.1
- Python 2.7.9
编辑: 我最终决定将脚本文件(带有 shebang)写入磁盘并执行脚本文件,而不是将脚本传送到某些语言(如 Python)的语言解释器。
我怀疑,问题与某些解释器缓冲 IO 的方式有关,我无法解决这个问题,因此有必要对磁盘进行额外的一轮。
【问题讨论】: