child.stderr.on("data", (data)=> {process.stdout.write(data);});
child.stdout.on("data", (data)=> {process.stdout.write(data);});
var child = spawn('C:\\Python27\\python.exe', {
stdio: [0, 'pipe', 'pipe']
});
ptyhon默认是进入交互模式,将stdio[0],也就是stdin绑定到主进程的stdin上,stdout和stderr也输出到主进程上 这样就可以像正常的python交互模式一样完美使用,就算输错了也不会退出 但是…问题是… 我想将stdio全部重定向到我的网页上的xterm中,于是stdin必须改成’pipe’
stdio: [ 'pipe', 'pipe', 'pipe']
...
e.on('data',(data)=>{
child.stdin.write(data);
});
这样改了后,进程创建后不会出现下面
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32 Type “help”, “copyright”, “credits” or “license” for more information. >>>
这样的stderr输出,而且stdin.write(…);后,stderr和stdout都没输出…,不管你stdin怎么输入都没反应 只有当输入错误时才会出现下面的
>>> ! File “<stdin>”, line 1 ! ^ SyntaxError: invalid syntax
但是,这个输出完了后子进程就被关闭了… 想来想去都想不通,子进程的stdin到底是怎么回事, 也就是stdin和shell之间发生了什么?为什么会影响到stdout,stderr…还有不正常的输出和不正常的关闭问题…
类似 node 的机制 py 的 repl 启动时也应该会检测,可以 spawn 的时候加 -m code
参数