Node.js:是否可以为python交互式外壳(REPL)制作适配器?

问题描述 投票:1回答:1

[可以在Node.js中使用readline读取一行python代码,然后将其发送到作为子进程的python交互式shell spawn中,然后接收输出?

我知道这是可能的:

import { spawn } from "child_process";

const py = spawn("python", ["-i"]);

py.stdout.on("data", (data) => {
  console.log(`stdout: ${data}`);
});

py.stdin.write('print("hello from python!")\n');

// will get 'stdout: hello from python!'

但是,这将不起作用:

import { spawn } from "child_process";
import * as readline from "readline";

const py = spawn("python", ["-i"]);

py.stdout.on("data", (data) => {
  console.log(`stdout: ${data}`);
});

py.stdin.write('print("hello from python!")\n');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
rl.prompt();
rl.on("line", (line) => {
  py.stdin.write(line);
  rl.prompt();
}).on("close", () => {
  process.exit()
});

我想这样做,因为我想在Node.js中为python开发一个接口。通过spawn执行独立的python命令/文件很简单,但是我想构建一个功能齐全的接口,该接口具有与R中的Reticulate类似的功能。

javascript python node.js ffi read-eval-print-loop
1个回答
0
投票

我有一个类似的应用程序,我设法使其运行足以满足我的需要:a processToPromise function。缺点是它总是必须在每个processToPromise上注册新的事件侦听器。基本上,它会在命令完成后等待交互式Python shell打印它的call,并为您提供与此同时出现的输出。

而且,您不能异步调用此函数多次而不会弄乱结果。首先尝试一些简单的打印语句,以查看所达到的期望。


一些参考代码:

>>>
© www.soinside.com 2019 - 2024. All rights reserved.