De la tuyauterie (ou de commande de chaînage) avec QProcess
J'utilise Qt et bash-dessus d'elle, besoin d'exécuter quelque chose comme:
bash: cat file | grep string
dans Qt:
QString cmd = "cat file | grep string";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();
Le problème est dans le pipe ("|"), et les processus de returs rien. Si il n'existe pas ("|"), comme
"cat file"
tout est ok.
J'ai essayé de qch. comme
"cat file \\| grep string",
"cat file \| grep string"
mais le résultat est le même. Si je copie la commande et l'exécuter dans le bash tout est ok.
QString::toAscii().data()
et d'autres transformations ont également mauvais résultat.
Essayez
Aucun argument là... Car il y a une API dédiée, votre réponse, c'est mieux. D'autre part, l'invocation du shell peut permettre pour des commandes plus complexes, par exemple à l'aide de processus de substitution, coquille d'expansion, etc, donc il peut avoir certains avantages dans certaines conditions.
cmd = "bash -c 'cat file | grep string'";
Aucun argument là... Car il y a une API dédiée, votre réponse, c'est mieux. D'autre part, l'invocation du shell peut permettre pour des commandes plus complexes, par exemple à l'aide de processus de substitution, coquille d'expansion, etc, donc il peut avoir certains avantages dans certaines conditions.
OriginalL'auteur Konstantin Ivanov | 2014-01-03
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous ne peut pas exécuter une commande système avec QProcess, mais un seul processus. Donc, la solution sera de passer votre commande comme argument pour bash:
Votre réponse est parfaitement OK, c'est juste une solution de contournement.
Qu'entendez-vous par "système de commande"? Vous avez probablement signifiait quelque chose de plus précis, comme la "commande shell".
Je voulais dire
system
appel commeos.system()
en Python ousystem
de<cstdlib>
.OT, mais n'utilisez pas les os.system() en python. Les gens devraient utiliser le sous-processus module selon la documentation.
OriginalL'auteur Dmitry Markin
Rapide et sale hack serait celui-ci:
Vous pouvez également éviter de l'échapper avec C++11 est
R""
, mais le point est que, ne pas utiliser debash
là parce qu'qui permettra de faire fonctionner uniquement avec bash. Il ne fonctionnera pas sur incorporé avec busybox sans bash, juste des cendres, ou toute autre commune desktop shell./bin/sh
est généralement un lien symbolique vers le shell interprète utilisé, de sorte que finalement le travail.MAIS!
Je pense que vous pensez un peu trop bas niveau lors de l'utilisation de haut niveau que le C++et la programmation orientée objet framework comme Qt. Je recommande de ne pas invoquer les commandes dans le faible niveau de la voie lorsque vous l'exécutez à partir de bash. Il y a certaines haut niveau de confort de l'API pour ce cas d'utilisation.
Basé sur la la documentation officielle, QProcess est censé travailler pour le tuyau avais commandes:
En d'autres termes, la commande1 | commande2 commande shell de commande peut être réalisé de la manière suivante:
Ce n'est pas le point principal, mais d'une suggestion utile: ne pas utiliser
QString::toAscii()
. L'API a été dépréciée dans Qt 5.Toute réflexion sur le temps long processus en cours d'exécution? Que faire si process1 est une session telnet et je veux process2 de réécrire la sortie de fabrication1 session telnet. Je voudrais encore envoyer des commandes à process1, mais besoin de tuyau de sortie à process2? Code bienvenue.
OriginalL'auteur lpapp
Le problème est que lorsque vous appelez processus->start(cmd), les commandes de la suite de l'appel à chat sont tous interprétés comme des arguments de chat, de sorte que le tuyau n'est pas de faire ce que vous attendez. Si vous commencez avec un appel à bash avec un paramètre de chaîne, vous devriez obtenir ce que vous voulez: -
Alternativement, vous pouvez simplement appeler "chat" et faire de la recherche sur le revenu QString quand vous lisez la sortie de la QProcess
Je soupçonne que peut être dû à la façon dont la commande awk est passé avec les personnages. Si vous supprimez le awk et tout tuyau de grep, cela fonctionne comme prévu? Si cela fonctionne, ajouter le awk, mais d'échapper les guillemets.
J'ai échappé aux apostrophes...toujours le même résultat... fpaste.org/111471/32714861
À l'aide de stdout comme un nom de variable est probablement une mauvaise idée. Cela fonctionne pour moi: pastebin.com/1jZWDL0C
Qdebug fonctionne pour moi aussi, à l'aide de "sortie" variable fait pas de différence avec la sortie à l'aide de cout aussi.....je pense donc que le problème est avec le cout de la manipulation de la sortie....
OriginalL'auteur TheDarkKnight
comment à ce sujet :
OriginalL'auteur bulldog68