Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt4-Linux] Comportement de KProcess

J'ai du mal à comprendre le comportement de KProcess. J'ai le même problème si j'utilise un QProcess
Le but est d'exécuter un programme qui me demandera un mot de passe.

Voilà ce que je fais :
À l'initialisation de la classe :
    connect(&this->process,SIGNAL(readyRead(void)),this,SLOT(getProcessOutput(void)));
connect(&this->process,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(close(void)));
this->process.setEnvironment(QStringList() << "LANG="); //pour que le logiciel en question me renvoie des messages en langue native
this->process.setOutputChannelMode(KProcess::MergedChannels);
La fonction qui lance le process :
    this->process << "mon_programme";
this->process.execute(1000);
La fonction qui analyse les messages du process :
    QStringList list = QString::fromLocal8Bit(this->process.readAll()).split("\n");
list.removeAll( "" );

this->messages += list; //messages est un QQueue qui contient tous les messages reçus
list.clear();

while ( !this->messages.isEmpty() )
{
QString analyse = this->messages.dequeue();

if ( analyse.contains("Invalid password") )
KMessageBox::error(NULL,i18n("The current password is not valid."));

if ( analyse.contains("Enter Password:") )
this->process.write( this->ui->txtPassword->text().toLocal8Bit()+"\n" );
}
Le code fonctionne très bien lorsque l'application est exécutée par un double-clic ou lorsque je clique sur le .desktop correspondant.
Par contre si j'exécute en ligne de commandes, le mot de passe n'est pas correctement envoyée. Je n'arrive pas à comprendre comment faire.

Réponses

  • Salut !

    Tu peux nous donner la commande que tu envoie stp ?

    As-tu essayer en debug pour savoir ou ça va pécher?

    J'opterai pour ta liste vide à vérifier ...

    Cordialement
  • J'ai simplifié le code mais je suis déjà en mode debug. Il y à des qDebug() un peu partout en fait.
    La liste vide ne sert pas à grand chose, c'est seulement une étape pour enlever les messages vides. C'est bien les QString du QQueue qui sont analysés.
  • J'ai simplifié le code mais je suis déjà en mode debug. Il y à des qDebug() un peu partout en fait.
    La liste vide ne sert pas à grand chose, c'est seulement une étape pour enlever les messages vides. C'est bien les QString du QQueue qui sont analysés.
  • Si ça marche avec les raccourcis c'est surement ta commande qui n'est pas bonne .....

    A vérifier.
  • Appelles-tu le process avec un chemin relatif ou un chemin absolu ?
  • La commande ne change pas, seulement la méthode d'exécution.
    Je le redis : via un terminal, les messages de l'application sont reçus dans le terminal ; mon application ne les voit pas du tout. J'ai pourtant choisi le mode MergedChannel.
    Via un double-clic aucun problème.

    Je me complique peut-être un peu, l'utilisateur n'a pas besoin de le lancer via un terminal.

    Je ne spécifie aucun chemin d'accès.
  • December 2008 modifié
    Le problème comme la soulevé chsxf c'est que si tu est en chemin relatif tu peut ne pas être au même endroit ....
    Si tu est en chemin absolu...bin ... je vois pas ^^ vérifie que tu n'est pas d'espace ou de caractère bizarre ^^

    Cordialement
  • Pour appeler ton programme depuis K/QProcess, il te faut bien passer le nom de l'exécutable à lancer !
    Donc, si tu mets juste de le nom de ton programme, c'est un chemin relatif et cela peut être la cause de ton problème.

    Essaie en faisant ceci :
    this->process << QCoreApplication::applicationDirPath() + "/mon_programme";
  • chsxf said:
    Pour appeler ton programme depuis K/QProcess, il te faut bien passer le nom de l'exécutable à lancer !
    Donc, si tu mets juste de le nom de ton programme, c'est un chemin relatif et cela peut être la cause de ton problème.

    Essaie en faisant ceci :
    this->process << QCoreApplication::applicationDirPath() + "/mon_programme";
    Le programme s'exécute aussi bien en relatif qu'en absolu (il est dans /usr/bin, pas dans le répertoire de mon application) ; ça n'a rien changé.
  • J'ai l'impression que la demande de mot de passe ne se fait ni sur la sortie standard, ni sur la sortie pour les erreurs.
    Plutôt que faire un readAll j'ai utilisé les fonctions readAllStandardOutput et readAllStandardError et pour chaque résultat j'ai mis un debug du genre qDebug() << "std:" << ... et qDebug() << "err:" << ...

    Le logiciel exécuté me demande bien le mot de passe mais aucun "std:" ni "err:" devant.
  • Question idiote, mais quand tu dis "le logiciel exécuté me demande bien le mot de passe", il te le demande comment ? via une boîte de dialogue ? Ton logiciel est un outil en ligne de commande ?
  • Celui exécuté est commande exclusivement. Mon logiciel est une interface graphique pour celui-ci.
Connectez-vous ou Inscrivez-vous pour répondre.