Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QProcess::readAll and QProcess::readAllStandardOutput both return an empty string after QProcess::write() is run

QProcess::readAll and QProcess::readAllStandardOutput both return an empty string after QProcess::write() is run

Scheduled Pinned Locked Moved Solved General and Desktop
qprocessreadlinestdioqt 5.7qtcreator
15 Posts 8 Posters 18.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    dheerendra
    Qt Champions 2022
    wrote on 25 Jan 2017, 01:23 last edited by
    #2

    Did u start event loop before waiting for the response to come from your external processes?

    Dheerendra
    @Community Service
    Certified Qt Specialist
    http://www.pthinks.com

    C 1 Reply Last reply 25 Jan 2017, 01:49
    3
    • D dheerendra
      25 Jan 2017, 01:23

      Did u start event loop before waiting for the response to come from your external processes?

      C Offline
      C Offline
      CybeX
      wrote on 25 Jan 2017, 01:49 last edited by
      #3

      @dheerendra hi, thanks for the response.

      Event loop? This is all the code related to the process.

      If you could provide an example on a possible event loop, I believe it would be of much use

      Thanks!

      J 1 Reply Last reply 25 Jan 2017, 05:26
      0
      • C CybeX
        25 Jan 2017, 01:49

        @dheerendra hi, thanks for the response.

        Event loop? This is all the code related to the process.

        If you could provide an example on a possible event loop, I believe it would be of much use

        Thanks!

        J Online
        J Online
        jsulm
        Lifetime Qt Champion
        wrote on 25 Jan 2017, 05:26 last edited by
        #4

        @CybeX After writing you should first wait for readyRead.
        Instead you read just after writing:

        p->write(QString(input + QString("\n")).toLatin1()); 
        qDebug() << p->readAll();
        qDebug() << p->readAllStandardOutput();
        

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • V Offline
          V Offline
          VRonin
          wrote on 25 Jan 2017, 06:58 last edited by VRonin
          #5

          why, oh why, did The Lord invent the synchronous API?! it's an aberration!

          QString gen_serv::runCommand(const QString& cmd, const QString& input){
          QString result;
          QEventLoop looper;
          Process *p = new QProcess(&looper);
          p->setProcessChannelMode(QProcess::MergedChannels);
          QObject::connect(p,&QProcess::finished,&looper,&QEventLoop::quit);
          QObject::connect(p,&QProcess::errorOccurred,[&result]()->void{qDebug("Error in Process"); result.clear();});
          QObject::connect(p,&QProcess::errorOccurred,&looper,&QEventLoop::quit);
          QObject::connect(p,&QProcess::started,[p,&input]()->void{p->write((input +'\n').toLatin1());});
          QObject::connect(p,&QProcess::readyReadStandardOutput,[p,&result]()->void{result+=p->readAllStandardOutput();});
          const QString c = QString("sh -c \"" + cmd + "\" ");
          p->start(c);
          looper.exec();
          return result;
          }
          

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          C 1 Reply Last reply 25 Jan 2017, 09:20
          5
          • V VRonin
            25 Jan 2017, 06:58

            why, oh why, did The Lord invent the synchronous API?! it's an aberration!

            QString gen_serv::runCommand(const QString& cmd, const QString& input){
            QString result;
            QEventLoop looper;
            Process *p = new QProcess(&looper);
            p->setProcessChannelMode(QProcess::MergedChannels);
            QObject::connect(p,&QProcess::finished,&looper,&QEventLoop::quit);
            QObject::connect(p,&QProcess::errorOccurred,[&result]()->void{qDebug("Error in Process"); result.clear();});
            QObject::connect(p,&QProcess::errorOccurred,&looper,&QEventLoop::quit);
            QObject::connect(p,&QProcess::started,[p,&input]()->void{p->write((input +'\n').toLatin1());});
            QObject::connect(p,&QProcess::readyReadStandardOutput,[p,&result]()->void{result+=p->readAllStandardOutput();});
            const QString c = QString("sh -c \"" + cmd + "\" ");
            p->start(c);
            looper.exec();
            return result;
            }
            
            C Offline
            C Offline
            CybeX
            wrote on 25 Jan 2017, 09:20 last edited by
            #6

            @VRonin said in QProcess::readAll and QProcess::readAllStandardOutput both return an empty string after QProcess::write() is run:

            hi

            Thank you very much for the solution!

            Just one small issue:

            error: ‘connect’ was not declared in this scope
                 connect(p,&QProcess::finished,&looper,&QEventLoop::quit);
                                                                        ^
            

            Not so sure about this one...

            1 Reply Last reply
            0
            • V Offline
              V Offline
              VRonin
              wrote on 25 Jan 2017, 09:55 last edited by
              #7

              put QObject:: in front, edited the code above

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              C 1 Reply Last reply 25 Jan 2017, 11:42
              0
              • V VRonin
                25 Jan 2017, 09:55

                put QObject:: in front, edited the code above

                C Offline
                C Offline
                CybeX
                wrote on 25 Jan 2017, 11:42 last edited by
                #8

                @VRonin hi, same 'same' error

                My includes for what it is worth

                #include <QCoreApplication>
                #include <QLoggingCategory>
                #include <QTextStream>
                #include <QProcess>
                #include <QString>
                #include <QVariant>
                #include <QDebug>
                #include <QObject>
                #include <QEventLoop>
                

                Edited Code as give above:

                QString runCommand(const QString& cmd, const QString& input){
                
                    //I ignore cmd for testing purposes. I use a straightup cd to script and execute
                
                    QString result;
                    QEventLoop looper;
                    QProcess *p = new QProcess(&looper);
                    p->setProcessChannelMode(QProcess::MergedChannels);
                    QObject::connect(p,&QProcess::finished,&looper,&QEventLoop::quit);
                    QObject::connect(p,&QProcess::errorOccurred,[&result]()->void{qDebug("Error in Process"); result.clear();});
                    QObject::connect(p,&QProcess::errorOccurred,&looper,&QEventLoop::quit);
                    QObject::connect(p,&QProcess::started,[p,&input]()->void{p->write((input +'\n').toLatin1());});
                    QObject::connect(p,&QProcess::readyReadStandardOutput,[p,&result]()->void{result+=p->readAllStandardOutput();});
                    const QString c = QString("sh -c \" cd /home/dev; ./script\" ");
                    p->start(c);
                    looper.exec();
                    return result;
                }
                

                Error:

                main.cpp:296: error: no matching function for call to ‘QObject::connect(QProcess*&, <unresolved overloaded function type>, QEventLoop*, void (QEventLoop::*)())’
                     QObject::connect(p,&QProcess::finished,&looper,&QEventLoop::quit);
                                                                                     ^
                
                1 Reply Last reply
                0
                • V Offline
                  V Offline
                  VRonin
                  wrote on 25 Jan 2017, 12:03 last edited by
                  #9

                  My bad. if it happens again look at the documentation for the signal and/or slot (depending where <unresolved overloaded function type> appears). In this case: http://doc.qt.io/qt-5/qprocess.html#finished

                  so instead of &QProcess::finished use static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished)

                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                  ~Napoleon Bonaparte

                  On a crusade to banish setIndexWidget() from the holy land of Qt

                  1 Reply Last reply
                  1
                  • T Offline
                    T Offline
                    tarod.net
                    wrote on 25 Jan 2017, 13:44 last edited by
                    #10

                    I would like to post my Stack Oveflow answer. It's actually an example where we write the name and get also the output given by the script.

                    Code:

                    #include <QCoreApplication>
                    #include <QProcess>
                    #include <QDebug>
                    
                    class MyProcess : public QProcess
                    {
                        Q_OBJECT
                    
                    public:
                        MyProcess(QObject *parent = 0);
                        ~MyProcess() {}
                    
                    public slots:
                        void myReadyRead();
                        void myReadyReadStandardOutput();
                    };
                    
                    MyProcess::MyProcess(QObject *parent)
                    {
                        connect(this,SIGNAL(readyRead()),
                                this,SLOT(myReadyRead()));
                        connect(this,SIGNAL(readyReadStandardOutput()),
                                this,SLOT(myReadyReadStandardOutput()));
                    }
                    
                    void MyProcess::myReadyRead() {
                        qDebug() << Q_FUNC_INFO;
                    }
                    
                    void MyProcess::myReadyReadStandardOutput() {
                        qDebug() << Q_FUNC_INFO;
                        // Note we need to add \n (it's like pressing enter key)
                        this->write(QString("myname" + QString("\n")).toLatin1());
                        // Next line no required
                        // qDebug() << this->readAll();
                        qDebug() << this->readAllStandardOutput();
                    
                    }
                    
                    int main(int argc, char *argv[])
                    {
                        QCoreApplication a(argc, argv);
                    
                        MyProcess *myProcess = new MyProcess();
                    
                        QString program = "/home/fran/code/myscript.sh";
                    
                        myProcess->start("/bin/sh", QStringList() << program);
                    
                        a.exec();
                    }
                    
                    #include "main.moc"
                    

                    Script:

                    echo "enter your name:"
                    read n
                    if [ ! -z "$n" ];
                    then
                            echo "success"
                            exit 0;
                    else
                            echo "failed"
                            exit 1;
                    fi
                    

                    "Individually, we are one drop. Together, we are an ocean."

                    C sitesvS 2 Replies Last reply 25 Jan 2017, 13:56
                    2
                    • T tarod.net
                      25 Jan 2017, 13:44

                      I would like to post my Stack Oveflow answer. It's actually an example where we write the name and get also the output given by the script.

                      Code:

                      #include <QCoreApplication>
                      #include <QProcess>
                      #include <QDebug>
                      
                      class MyProcess : public QProcess
                      {
                          Q_OBJECT
                      
                      public:
                          MyProcess(QObject *parent = 0);
                          ~MyProcess() {}
                      
                      public slots:
                          void myReadyRead();
                          void myReadyReadStandardOutput();
                      };
                      
                      MyProcess::MyProcess(QObject *parent)
                      {
                          connect(this,SIGNAL(readyRead()),
                                  this,SLOT(myReadyRead()));
                          connect(this,SIGNAL(readyReadStandardOutput()),
                                  this,SLOT(myReadyReadStandardOutput()));
                      }
                      
                      void MyProcess::myReadyRead() {
                          qDebug() << Q_FUNC_INFO;
                      }
                      
                      void MyProcess::myReadyReadStandardOutput() {
                          qDebug() << Q_FUNC_INFO;
                          // Note we need to add \n (it's like pressing enter key)
                          this->write(QString("myname" + QString("\n")).toLatin1());
                          // Next line no required
                          // qDebug() << this->readAll();
                          qDebug() << this->readAllStandardOutput();
                      
                      }
                      
                      int main(int argc, char *argv[])
                      {
                          QCoreApplication a(argc, argv);
                      
                          MyProcess *myProcess = new MyProcess();
                      
                          QString program = "/home/fran/code/myscript.sh";
                      
                          myProcess->start("/bin/sh", QStringList() << program);
                      
                          a.exec();
                      }
                      
                      #include "main.moc"
                      

                      Script:

                      echo "enter your name:"
                      read n
                      if [ ! -z "$n" ];
                      then
                              echo "success"
                              exit 0;
                      else
                              echo "failed"
                              exit 1;
                      fi
                      
                      C Offline
                      C Offline
                      CybeX
                      wrote on 25 Jan 2017, 13:56 last edited by CybeX
                      #11

                      Original SO thread

                      1 Reply Last reply
                      0
                      • T tarod.net
                        25 Jan 2017, 13:44

                        I would like to post my Stack Oveflow answer. It's actually an example where we write the name and get also the output given by the script.

                        Code:

                        #include <QCoreApplication>
                        #include <QProcess>
                        #include <QDebug>
                        
                        class MyProcess : public QProcess
                        {
                            Q_OBJECT
                        
                        public:
                            MyProcess(QObject *parent = 0);
                            ~MyProcess() {}
                        
                        public slots:
                            void myReadyRead();
                            void myReadyReadStandardOutput();
                        };
                        
                        MyProcess::MyProcess(QObject *parent)
                        {
                            connect(this,SIGNAL(readyRead()),
                                    this,SLOT(myReadyRead()));
                            connect(this,SIGNAL(readyReadStandardOutput()),
                                    this,SLOT(myReadyReadStandardOutput()));
                        }
                        
                        void MyProcess::myReadyRead() {
                            qDebug() << Q_FUNC_INFO;
                        }
                        
                        void MyProcess::myReadyReadStandardOutput() {
                            qDebug() << Q_FUNC_INFO;
                            // Note we need to add \n (it's like pressing enter key)
                            this->write(QString("myname" + QString("\n")).toLatin1());
                            // Next line no required
                            // qDebug() << this->readAll();
                            qDebug() << this->readAllStandardOutput();
                        
                        }
                        
                        int main(int argc, char *argv[])
                        {
                            QCoreApplication a(argc, argv);
                        
                            MyProcess *myProcess = new MyProcess();
                        
                            QString program = "/home/fran/code/myscript.sh";
                        
                            myProcess->start("/bin/sh", QStringList() << program);
                        
                            a.exec();
                        }
                        
                        #include "main.moc"
                        

                        Script:

                        echo "enter your name:"
                        read n
                        if [ ! -z "$n" ];
                        then
                                echo "success"
                                exit 0;
                        else
                                echo "failed"
                                exit 1;
                        fi
                        
                        sitesvS Offline
                        sitesvS Offline
                        sitesv
                        wrote on 2 Sept 2020, 09:58 last edited by
                        #12

                        @tarod-net
                        Hi!
                        I have this output without input stream from keyboard:

                        void MyProcess::myReadyRead()
                        void MyProcess::myReadyReadStandardOutput()
                        "enter your name\n"
                        void MyProcess::myReadyRead()
                        void MyProcess::myReadyReadStandardOutput()
                        "success\n"
                        

                        Is this correct?

                        JonBJ 1 Reply Last reply 2 Sept 2020, 13:49
                        0
                        • sitesvS sitesv
                          2 Sept 2020, 09:58

                          @tarod-net
                          Hi!
                          I have this output without input stream from keyboard:

                          void MyProcess::myReadyRead()
                          void MyProcess::myReadyReadStandardOutput()
                          "enter your name\n"
                          void MyProcess::myReadyRead()
                          void MyProcess::myReadyReadStandardOutput()
                          "success\n"
                          

                          Is this correct?

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on 2 Sept 2020, 13:49 last edited by
                          #13

                          @sitesv said in QProcess::readAll and QProcess::readAllStandardOutput both return an empty string after QProcess::write() is run:

                          Is this correct?

                          As code? No.

                          sitesvS 1 Reply Last reply 2 Sept 2020, 17:25
                          0
                          • JonBJ JonB
                            2 Sept 2020, 13:49

                            @sitesv said in QProcess::readAll and QProcess::readAllStandardOutput both return an empty string after QProcess::write() is run:

                            Is this correct?

                            As code? No.

                            sitesvS Offline
                            sitesvS Offline
                            sitesv
                            wrote on 2 Sept 2020, 17:25 last edited by
                            #14

                            @JonB I don't know why this example does the output like this....

                            1 Reply Last reply
                            0
                            • B Offline
                              B Offline
                              Bitbrat
                              wrote on 12 Apr 2021, 17:09 last edited by
                              #15

                              QProcess has quite extensive support for synchronous use.

                              #include <QCoreApplication>
                              #include <QDebug>
                              #include <QProcess>
                              
                              int main(int argc, char **argv)
                              {
                                  QCoreApplication app(argc, argv);
                              
                                  QProcess process;
                                  process.start("ls", {"-l"});
                                  if (process.waitForFinished()) {
                                      qDebug() << "returned:" << process.readAllStandardOutput();
                                  } else {
                                      qDebug() << process.errorString();
                                  }
                              
                                  process.start("ls", {"-l"});
                                  while (process.waitForReadyRead()) {
                                      while (process.canReadLine())
                                          qDebug() << process.readLine().trimmed();
                                  }
                              }
                              
                              1 Reply Last reply
                              0

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved