2016-01-05 135 views
1

我有一个运行python程序的nodejs脚本。我希望能够在调试会话开始时与pdb进行交互。pdb/ipdb如何处理调试标准输入/标准输出

我用这个来开始我的过程:

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进行交互?

回答

1

好吧,我发现怎么做......

除了手动管道流中,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,我们可能不会传输所有内容。终端有一些特殊的指令,他们可能不会传递到标准输入或标准输出,而管道。

这个答案对于NodeJS来说非常具体,但我想如果我们从python到python做同样的事情,我们必须通过传递sys.[stdin, stdout, stderr]来做与子进程相同的事情。

相关问题