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

funciona cuando se ejecuta a través de la terminal. Pero no a través QProcessComando que trabaja en la terminal, pero no a través de QProcess

Mi código de ejemplo es

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

Nada está siendo visualizado en textedit.

pero cuando uso solo ifconfig en el inicio de qprocess, la salida se muestra en textedit. ¿Perdí algún truco para construir el comando ifconfig | grep 'inet', como usar \' para ' y \| para |? para personajes especiales? pero he intentado que así :(

+0

necesita especificar la ruta completa para ifconifg. Su aplicación tiene una variable PATH diferente a la suya terminal –

+0

@KamilKlimek Como este podría ser el problema para comandos individuales, en este caso la tubería de comandos (que no es compatible con QProcess) es el verdadero problema. – leemes

+0

¡Correcto! Totalmente se olvidó de ese –

Respuesta

34

QProcess ejecuta un único proceso. . lo que estamos tratando de hacer es ejecutar un comando shell , no un proceso la tubería de comandos es una característica de su cáscara

Hay tres soluciones posibles:.

poner el comman d desea ser ejecutado como un argumento a sh después -c ("orden"):

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

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

O usted podría escribir los comandos como entrada estándar a sh:

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

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

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

Otro enfoque que evita sh, es poner en marcha dos QProcesses y hacer la tubería en el código:

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

¿Y cómo se hace? – ScarCode

+5

Agregué ejemplos de código para algunas posibles soluciones. – leemes

+2

Grep trabajó.Pero quiero canalizar la salida de ifconfig a awk '/inet/{gsub(/.*:/,"" ,$1);print$1}'. que exitosamente imprimió algunos o/p en el terminal y no a través de Qprocess. Me usé el 2 de tu solución – ScarCode

6

El objeto QProcess no automáticamente le dan la sintaxis del shell toda regla: no se puede utilizar tubos de utilizar un shell para esto:.

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

Intenté esto también. ¡pero aún no funciona! – ScarCode

+1

Ah sí, deben ser comillas dobles, no comillas. – kmkaplan

+3

alternativa (más seguro ya que no tiene que prestar atención al escape dentro del argumento, si es más complicado): use QStringList para los argumentos, como este: 'p1.start ("/bin/sh ", QStringList() < <"-c" << "ifconfig | grep inet"); ' – leemes

4

no se puede utilizar el p Ipe símbolo en QProcess parece.

Sin embargo, existe el método setStandardOutputProcess que canalizará la salida al siguiente proceso.

Se proporciona un ejemplo en la API.

Cuestiones relacionadas