2015-01-05 87 views
9

我正在寫一個約曼發電機和使用child_process.spawn()(通過自耕農的spawnCommand() - 見https://github.com/yeoman/generator/blob/master/lib/actions/spawn_command.js節點的子進程的stdout產卵返回爲空

我的代碼如下所示:

var list = this.spawnCommand('npm', ['list', 'sails'], {stdio: 'pipe'}); 
list.stdout.on('data', /* callback here that wants to consume the command's output */); 

我可以看到list.stdio存在,它有[0,1,2]作爲鍵。它們中的每一個都爲空(或未定義)。即,日誌記錄_.keys(list).join()輸出,,list.stdout.on()給了我一個例外,說明stdout爲空。

我需要完成的是檢查是否安裝了特定的軟件包並查看版本號是什麼。但是我後來還需要做其他事情來解析CLI命令的輸出(例如,git log output),所以我需要一個通用的解決方案。 .spawn()看起來像我想要的,但我看到的例子似乎表明,標準輸出應該是有一個.on()方法。例如,這裏給出的那個:http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options它顯示正在運行ls -lh /usr

我是否缺少一些簡單的東西?我想知道如果我運行的命令沒有返回任何輸出,如果這意味着標準輸出將爲空。如果是這種情況,那麼我只需要確定可能沒有輸出的命令,並在嘗試使用它之前檢查以確保stdout不爲null。

編輯實際上,故宮list命令的輸出顯示了在命令行,但我用來診斷問題(我會在.spawnCommand()調用後和.on()調用之前把日誌語句後。但我需要在我的代碼中訪問它 - 讓它在命令行上顯示出來(除了它讓我知道該進程成功運行CLI命令)。

+0

有沒有找出原因是什麼?我現在也在尋找答案。 – Rondo

+0

不太遠:(對不起 – jinglesthula

回答

10

我剛剛遇到了這個 - haven' t看起來太深入細節了,但我可以告訴你,在spawn的選項中設置{stdio: 'whatever'}可以防止spawn返回包含stdoutstderr流的對象 - 兩者將是null

如果刪除選項,他們將再次(和訪問是完全成熟的流通過.on()

the docs you linked to,它看起來像你可以stdio設置爲現有流 - 也許這就是靈活性,您是在尋找?

+3

有沒有辦法設置'{stdio:'繼承或任何'}'並有權訪問孩子的'stdout' /'stderr'流? –

+0

@KennethWorden基於我對文檔的理解,'pipe'就是這個選項,但是OP的問題表明這個問題不起作用,不知道爲什麼。 –

0

如果孩子與stdio集催生了比其他任何事情‘管’,那麼subprocess.stdoutnull