pdb / ipdb如何处理调试stdin / stdout

时间:2016-01-05 07:52:43

标签: python node.js child-process pdb ipdb

我有一个运行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进行交互?

1 个答案:

答案 0 :(得分: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传输到另一个。这意味着发送到stdin的所有内容都将转到下一个程序,而stderr或stdout中的任何内容都将从程序到达终端。也就是说,如果我们将数据从一个fd流式传输到另一个,我们可能无法传输所有内容。终端有一些特殊的指令,它们可能不会在管道传递给stdin或stdr时传递给stdinr。

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