2015-01-05 10 views
9

मैं एक Yeoman जनरेटर लिख रहा हूँ और child_process.spawn() का उपयोग कर (Yeoman के 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 शून्य है।

मुझे क्या हासिल करने की आवश्यकता है यह जांचना है कि कोई विशेष पैकेज स्थापित है या नहीं और संस्करण संख्या क्या है। लेकिन मुझे बाद में अन्य चीजों को करने की ज़रूरत है जहां मैं सीएलआई कमांड के आउटपुट को पार्स करता हूं (उदाहरण के लिए, गिट लॉग आउटपुट), इसलिए मुझे एक सामान्य समाधान की आवश्यकता है। .spawn() मुझे लगता है कि जैसा दिखता है, लेकिन मैंने जो उदाहरण देखा है, यह इंगित करता है कि stdout कुछ ऐसा होना चाहिए जिसमें .on() विधि हो। उदाहरण के लिए, यहां दिया गया एक: http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options जहां यह ls -lh /usr चल रहा है दिखाता है।

क्या मुझे कुछ आसान याद आ रही है? मैं सोच रहा हूं कि अगर मैं चलाता हूं तो कोई आउटपुट वापस नहीं आता है अगर इसका मतलब है कि स्टडआउट शून्य हो जाएगा। यदि ऐसा है, तो मुझे केवल उन आदेशों की पहचान करने की आवश्यकता होगी जिनके पास कोई आउटपुट नहीं हो सकता है और यह सुनिश्चित करने के लिए जांचें कि स्टडआउट इसका उपयोग करने से पहले शून्य नहीं है।

संपादित वास्तव में, NPM सूची आदेश के उत्पादन कमांड लाइन पर दिखाया जा रहा है, लेकिन लॉग बयान के बाद मैं इस मुद्दे (जो मैं .spawnCommand() कॉल के बाद और इससे पहले कि .on() कॉल डाल था निदान करने के लिए उपयोग कर रहा था। लेकिन मुझे अपने कोड में इसका उपयोग करने की आवश्यकता है - इसे कमांड लाइन पर दिखाए जाने के बाद बिंदु के बगल में है (इसके अलावा मुझे यह पता है कि प्रक्रिया सीएलआई कमांड सफलतापूर्वक चलती है)

+0

कभी पता लगाएं कि कारण क्या था? मैं अब भी एक जवाब की तलाश में हूं। – Rondo

+0

अभी तक नहीं :(क्षमा करें – jinglesthula

उत्तर

10

मैं बस इस में भाग गया - हेवन ' टी विवरण में बहुत गहराई से देखा, लेकिन मैं आपको बता सकता हूं कि स्पॉन के विकल्प में {stdio: 'whatever'} सेटिंग को स्पॉन को stdout और stderr स्ट्रीम के साथ किसी ऑब्जेक्ट को वापस करने से रोकता है - दोनों null होंगे।

आप उस विकल्प को निकाल देते हैं, वे पूरी तरह से विकसित धाराओं फिर से (और सुलभ .on() के माध्यम से हो जाएगा

the docs you linked to से, आप एक मौजूदा धारा को stdio सेट कर सकते हैं की तरह यह लग रहा है -। शायद कि लचीलापन है आप '?

+3

क्या '{stdio: 'उत्तराधिकारी या जो भी'} 'सेट करने का कोई तरीका है और बच्चे के' stdout' /' stderr' धाराओं तक पहुंच है? –

+0

@ केनेथवॉर्डन दस्तावेज़ों की मेरी समझ के आधार पर , 'पाइप' वह विकल्प है, लेकिन ओपी का सवाल इंगित करता है कि काम नहीं कर रहा है। सुनिश्चित नहीं है कि क्यों। –

0

की तलाश कर रहे हैं बच्चे के अलावा और कुछ करने के लिए stdio सेट के साथ पैदा किया गया था' पाइप 'है, तो subprocess.stdoutnull हो जाएगा।

देखें
संबंधित मुद्दे