0

我正在编写一个(相当愚蠢的)脚本。它需要做的一件事是,给定 python 代码,执行它。它还需要是交互式的。经过相当多的环顾后,我决定使用 child_process spawning。但是,当我尝试时,输出似乎没有出现。

以此为例:

var spawn = require('child_process').spawn;
var p = spawn('python3',['-q']);

p.stdout.on('data', function(data) {
    if (data.toString() != '>>> ') {
        console.log(data.toString());
    }
});

p.stdin.write("print('hello world')\n");

我在这里尝试做的事情应该很明显。我正在寻找的行为是让短语“hello world”出现在控制台中。然而,什么也没有出现。child_process exec 似乎可以工作,但就像我说的那样,我需要它是交互式的,而 exec 似乎无法做到这一点,因为所有输出都出现在最后而不是流中。帮助?

4

1 回答 1

0

因此,使其交互的最简单方法是使stdio选项继承。我从来没有找到一个完整的解决方案,因为这些交互式进程正在运行,childProcess.stdout并且childProcess.stdin仅管道该程序的输出。对于像 python 这样的交互式 shell,它不会输出任何东西,它会以 return code 退出0

const spawn = require('child_process').spawn;
spawn('python3', ['-q'], {stdio: 'inherit'});

但是为了p.stdout.on工作,你需要像这样产生它: spawn('python','-c','print("hello world");')你可以看到输出hello world

const spawn = require('child_process').spawn;
const p = spawn('python3', ['-c','print("hello world");']);

p.stdout.on('data', function(data) {
   console.log(data.toString());
});

您可以将其readline用于模拟交互性。

于 2020-05-10T00:30:17.023 回答