2010-03-09 10 views
5

हाय: मैं stdout को NSTextView पर रीडायरेक्ट करना चाहता हूं। क्या यह सबप्रोसेसेस के आउटपुट के साथ भी काम कर सकता है? इसे प्राप्त करने का सबसे अच्छा तरीका क्या हो सकता है?कोको में stdout को NSTextView पर रीडायरेक्ट करने का सबसे अच्छा तरीका क्या है?

संपादित करें: पीटर होसे के उत्तर के अनुसार मैंने निम्नलिखित लागू किए। लेकिन मुझे अधिसूचना नहीं मिली है। मैं क्या गलत कर रहा हूं?

NSPipe *pipe = [NSPipe pipe]; 
NSFileHandle *pipeHandle = [pipe fileHandleForWriting]; 
dup2(STDOUT_FILENO, [pipeHandle fileDescriptor]); 
NSFileHandle *fileHandle = [[NSFileHandle alloc] initWithFileDescriptor:pipeHandle]; 
[fileHandle acceptConnectionInBackgroundAndNotify]; 

NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; 
[dnc addObserver:self selector:@selector(handleNotification:) name:NSFileHandleConnectionAcceptedNotification object:fileHandle]; 
+0

पाइथन को इसके साथ क्या करना है? – Eimantas

+0

@Eimantas: आप सही हैं, यह सीधे सवाल से संबंधित नहीं है। असल में मैं पायओबेज का उपयोग कर पाइथन कोड लेखन के साथ संवाद करने के लिए ** stdout ** जो मैं प्रदर्शित करना चाहता हूं। मुझे टैग को हटा देना चाहिए ... – Sney

उत्तर

12

मैं वही काम करना चाहता था और इस पोस्ट में आया था। मैं इसे पढ़ने और एप्पल के दस्तावेज पढ़ने के बाद इसे समझने में सक्षम था। मैं यहां अपना समाधान शामिल कर रहा हूं। इंटरफ़ेस में "पाइप" और "पाइप रीडहैंडल" घोषित किए गए हैं।

pipe = [NSPipe pipe] ; 
pipeReadHandle = [pipe fileHandleForReading] ; 
dup2([[pipe fileHandleForWriting] fileDescriptor], fileno(stdout)) ; 

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNotification:) name: NSFileHandleReadCompletionNotification object: pipeReadHandle] ; 
[pipeReadHandle readInBackgroundAndNotify] ; 

handleNotification: विधि है

[pipeReadHandle readInBackgroundAndNotify] ; 
NSString *str = [[NSString alloc] initWithData: [[notification userInfo] objectForKey: NSFileHandleNotificationDataItem] encoding: NSASCIIStringEncoding] ; 
// Do whatever you want with str 
+0

इससे मुझे बहुत मदद मिली। धन्यवाद! मैंने आपके सुझाव का उपयोग किया और पाठ को देखने के लिए इन दो संदेशों को जोड़ा और निम्न का उपयोग करके स्वत: स्क्रॉल किया: [myTextView setText: [myTextView.text stringByAppendingString: str]]; [myTextView scrollRangeToVisible: NSMakeRange ([myTextView.text लंबाई], 0)]; – ThinkBonobo

5

मैं एक NSTextView को stdout रीडायरेक्ट करना चाहते हैं।

आपका अपना स्टडआउट?

क्या यह सबप्रोसेसेस के आउटपुट के साथ भी काम कर सकता है?

निश्चित रूप से।

इसे प्राप्त करने का सबसे अच्छा तरीका क्या हो सकता है?

फ़ाइल डिस्क्रिप्टर यहां आपका मित्र हैं।

एक पाइप बनाएं (या तो एनएसपीपी या pipe(2) का उपयोग करके) और dup2 इसका लेखन STDOUT_FILENO पर समाप्त होता है। Subprocesses का आह्वान करते समय, अपने stdout सेट मत करो; वे आपके stdout का वारिस करेंगे, जो आपकी पाइप है। (हालांकि, आप सबप्रोसेस में पठन अंत को बंद करना चाहते हैं। मुझे यकीन नहीं है कि यह आवश्यक होगा या नहीं; इसे आज़माएं और पता लगाएं। अगर यह चालू हो जाता है, तो आपको fork और exec का उपयोग करने की आवश्यकता होगी, और बीच में पढ़ने के अंत को बंद करें।)

kevent या NSFileHandle का उपयोग करके पृष्ठभूमि में पाइप के पढ़ने के अंत से पढ़ें। जब नया डेटा आता है, तो कुछ एन्कोडिंग का उपयोग करके इसकी व्याख्या करें और इसे टेक्स्ट व्यू की सामग्री में संलग्न करें।

यदि टेक्स्ट व्यू स्क्रॉल व्यू में है, तो आपको इसमें शामिल होने से पहले स्क्रॉल स्थिति की जांच करनी चाहिए। यदि यह अंत में था, तो आप शायद इसे जोड़ने के बाद अंत में कूदना चाहेंगे।

+0

मैंने प्रश्न को गैर-कार्यशील कार्यान्वयन के साथ संपादित किया? कोई सुराग? – Sney

+0

स्नेज: आपके पास गलत तरीके से 'dup2' के तर्क हैं। फिर आप एनएसफ़ाइलहैंडल पॉइंटर को एनएसफ़ाइलहैंडल बनाने के लिए फ़ाइल डिस्क्रिप्टर के रूप में पास करते हैं। फिर आप लिखते हैं कि लिखना अंत एक सॉकेट है और एक कनेक्शन स्वीकार करने का प्रयास करें, भले ही एफडी कभी भी श्रवण (2) से वापस नहीं लौटाया गया हो (क्योंकि वे एक पाइप हैं, सॉकेट नहीं)। 'Dup2' कॉल को ठीक करें, फ़ाइल हैंडल पॉइंटर का नाटक न करें फ़ाइल डिस्क्रिप्टर है, किसी भी सिरे के लिए एक और फ़ाइल हैंडल बनाने की कोशिश न करें, और * पढ़ने * से * पढ़ने * की कोशिश करें। –

2

PseudoTTY.app पर एक नज़र डालें init विधि में मैं निम्नलिखित कोड शामिल!

0

आईओएस के लिए stdout के बजाय stderr का उपयोग करें।

NSPipe *pipe = [NSPipe pipe]; 
pipeHandle = [pipe fileHandleForReading]; 
dup2([[pipe fileHandleForWriting] fileDescriptor], fileno(stderr)); 

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNotification:) name: NSFileHandleReadCompletionNotification object: pipeHandle] ; 
[pipeHandle readInBackgroundAndNotify] ; 

-(void)handleNotification:(NSNotification *)notification{ 

    [pipeHandle readInBackgroundAndNotify] ; 
    NSString *str = [[NSString alloc] initWithData: [[notification userInfo] objectForKey: NSFileHandleNotificationDataItem] encoding: NSASCIIStringEncoding] ; 

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

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