2012-05-22 14 views
17
ifconfig | grep 'inet' 

टर्मिनल के माध्यम से निष्पादित होने पर काम कर रहा है। लेकिन नहीं QProcessटर्मिनल में काम कर रहे कमांड, लेकिन QProcess

के माध्यम से

मेरे नमूना कोड

QProcess p1; 
p1.start("ifconfig | grep 'inet'"); 
p1.waitForFinished(); 
QString output(p1.readAllStandardOutput()); 
textEdit->setText(output); 

कुछ भी नहीं TextEdit पर प्रदर्शित हो रही है है।

लेकिन जब मैं qprocess की शुरुआत में केवल ifconfig का उपयोग करता हूं, तो टेक्स्ट टेक्स्टिट पर आउटपुट प्रदर्शित होता जा रहा है। | के लिए ' और \| के लिए \' का उपयोग करने के लिए ifconfig | grep 'inet' कमांड बनाने के लिए मुझे कोई चाल याद आई? विशेष पात्रों के लिए? लेकिन मैंने कोशिश की है कि रूप में अच्छी तरह :(

+0

आपको ifconifg के लिए पूर्ण पथ निर्दिष्ट करने की आवश्यकता है। आपके एप्लिकेशन में अलग-अलग पैथ वैरिएबल है, तो आप टर्मिनल –

+0

@KamilKlimek क्योंकि यह एकल कमांड के लिए समस्या हो सकती है, इस मामले में कमांड का पाइपिंग (जो QProcess द्वारा समर्थित नहीं है) असली मुद्दा है। – leemes

+0

सही! कुल मिलाकर उस –

उत्तर

34

QProcess एक ही प्रक्रिया निष्पादित करता है। । आपको क्या करने की कोशिश कर रहे हैं एक शेल कमांड क्रियान्वित है, न कि एक प्रक्रिया आदेशों की पाइपिंग अपने खोल की एक विशेषता है

तीन संभावित हल कर रहे हैं:।

कमांडरों रखो d आप के बाद -csh लिए एक तर्क के रूप निष्पादित करने के लिए चाहते हैं ("आदेश"):

QProcess sh; 
sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet"); 

sh.waitForFinished(); 
QByteArray output = sh.readAll(); 
sh.close(); 

या आप sh को मानक इनपुट के रूप में आदेशों लिख सकते हैं:

QProcess sh; 
sh.start("sh"); 

sh.write("ifconfig | grep inet"); 
sh.closeWriteChannel(); 

sh.waitForFinished(); 
QByteArray output = sh.readAll(); 
sh.close(); 

एक और दृष्टिकोण जो बचा जाता है

QProcess ifconfig; 
QProcess grep; 

ifconfig.setStandardOutputProcess(&grep); // "simulates" ifconfig | grep 

ifconfig.start("ifconfig"); 
grep.start("grep", QStringList() << "inet"); // pass arguments using QStringList 

grep.waitForFinished(); // grep finishes after ifconfig does 
QByteArray output = grep.readAll(); // now the output is found in the 2nd process 
ifconfig.close(); 
grep.close(); 
+0

और यह कैसे किया जाता है? – ScarCode

+5

मैंने कुछ संभावित समाधानों के लिए कोड उदाहरण जोड़े। – leemes

+2

Grep काम किया।लेकिन मैं ifconfig के आउटपुट को '/inet/{gsub(/.*:/,"",$1);print$1}' में पाइप करना चाहता हूं। जिसने टर्मिनल पर कुछ ओ/पी सफलतापूर्वक मुद्रित किया और Qprocess के माध्यम से नहीं। मैंने आपको अपने समाधान – ScarCode

6

QProcess वस्तु स्वतः ही आप पूर्ण विकसित खोल वाक्य रचना नहीं दे करता है: आप पाइप उपयोग नहीं कर सकते इस के लिए एक खोल का उपयोग करें:।

p1.start("/bin/sh -c \"ifconfig | grep inet\""); 
+1

मैंने यह भी कोशिश की। लेकिन अभी भी काम नहीं कर रहा !! – ScarCode

+1

आह हाँ, यह दोहरे उद्धरण होना चाहिए, उद्धरण नहीं। – kmkaplan

+3

वैकल्पिक (सुरक्षित है क्योंकि आपको तर्क के भीतर भागने के लिए ध्यान देना नहीं है, यदि यह अधिक जटिल है): तर्कों के लिए QStringList का उपयोग करें, जैसे: 'p1.start ("/bin/sh ", QStringList() < <"-c" << "ifconfig | grep inet"); ' – leemes

4

आप पी का उपयोग नहीं कर सकते हैं: sh, दो QProcesses लॉन्च करें और अपने कोड में पाइपिंग करना है ऐसा लगता है कि QProcess में आईपी प्रतीक।

हालांकि setStandardOutputProcess विधि है जो आउटपुट को अगली प्रक्रिया में पाइप करेगा।

एपीआई में एक उदाहरण प्रदान किया गया है।