我有一个运行python程序的nodejs脚本。我希望能够在调试会话开始时与pdb进行交互。
我用这个开始我的过程:
var cp = require('child_process')
var app = cp.spawn('python_app', ['param'])
app.stdout.pipe(process.stdout)
app.stderr.pipe(process.stderr)
process.stdin.pipe(app.stdin)
不幸的是,当调试会话开始时,我看不到任何东西,进程只是挂起。我想pdb/ipdb正在工作,但我做的任何事情似乎都没有发送到pdb。
是否可以从nodejs与pdb进行交互?
好的,我找到了如何做到这一点。。。
child_proccess库不是手动管道流,而是一个选项,它似乎正好满足了我的需求。
文件:
https://nodejs.org/api/child_process.html#child_process_options_stdio
代码变为:
var cp = require('child_process')
var app = cp.spawn('python_app', ['param'], {stdio: [0,1,2]})
不需要其他任何东西。目前还不清楚它会改变什么来产生这样的过程或以后的管道IO。但这种方法有效,而另一种则无效。
我的猜测是,如果我们通过传递文件描述符id直接使用相同的文件描述符。我们不会将数据从一个fd流式传输到另一个fd。这意味着发送到stdin的所有内容都将进入下一个程序,而stderr或stdout中的任何内容都将从程序进入终端。也就是说,如果我们将数据从一个fd流式传输到另一个fd,我们可能不会传输所有数据。终端有一些特殊的指令,它们可能不会在管道传输时传递到stdin或stdout、stderr。
这个答案非常特定于NodeJS,但我想,如果我们从python到python做同样的事情,我们就必须通过传递sys.[stdin, stdout, stderr]
来对子流程做同样的事。