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

działa po uruchomieniu przez terminal. Ale nie poprzez QProcessPolecenie działające w terminalu, ale nie za pośrednictwem QProcess

Mój przykładowy kod jest

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

Nic nie jest wyświetlane na uzyskiwanie TextEdit.

ale kiedy używam tylko ifconfig na początku qprocess, dane wyjściowe są wyświetlane na textedit. Czy brakowało mi jakiejś sztuczki do skonstruowania polecenia ifconfig | grep 'inet', jak użycie \' dla ' i \| dla |? dla znaków specjalnych? ale starałem się, że dobrze :(

+0

Musisz podać pełną ścieżkę dla ifconifg. Twoja aplikacja ma inną zmienną PATH niż terminal –

+0

@KamilKlimek Ponieważ może to być problemem dla pojedynczych poleceń, w tym przypadku problemem jest piping poleceń (który nie jest obsługiwany przez QProcess). – leemes

+0

Dobrze! totalnie zapomniałem o tym –

Odpowiedz

34

QProcess wykonuje jeden pojedynczy proces. ., co chce zrobić, to wykonanie polecenia powłoki, a nie proces rurociąg poleceń jest cechą powłokę

Istnieją trzy możliwe rozwiązania:.

umieścić comman d chcesz być wykonany jako argument do sh po -c („polecenia”):

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

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

Lub można napisać polecenia jako standardowego wejścia do sh:

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

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

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

inne podejście, które pozwala uniknąć sh jest uruchomienie dwóch QProcesses i wykonać orurowanie w kodzie:

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

Jak to się robi? – ScarCode

+5

Dodałem przykłady kodu dla niektórych możliwych rozwiązań. – leemes

+2

Grep pracował.Ale chcę potokować wyjście ifconfig do awk '/inet/{gsub(/.*:/,"",$1);print$1}'. który z powodzeniem wydrukował część o/p na terminalu, a nie przez Qprocess. Użyłem mnie jako 2 z twojego rozwiązania – ScarCode

6

Przedmiotem QProcess automatycznie nie daje pełnowartościowy składni powłoki: nie można użyć rur Użyj powłoki do tego.

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

Próbowałem też. ale wciąż nie działa !! – ScarCode

+1

Ach tak, powinny to być podwójne cytaty, a nie cytaty. – kmkaplan

+3

alternatywa (bezpieczniejsza, ponieważ nie musisz zwracać uwagi na ucieczkę w obrębie argumentu, jeśli jest to bardziej skomplikowane): użyj QStringList dla argumentów, takich jak to: 'p1.start ("/bin/sh ", QStringList() < <"-c" << "ifconfig | grep inet"); ' – leemes

4

nie można użyć p Symbol ipe w QProcess wydaje się.

Jednak istnieje metoda setStandardOutputProcess, która doprowadzi wyjście do następnego procesu.

Przykład znajduje się w interfejsie API.

Powiązane problemy