2016-01-05 184 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]來做與子進程相同的事情。

相關問題