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
Forum Updated to NodeBB v4.3 + New Features

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 19.5k Views 2 Watching
  • 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.
  • 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 Offline
    J Offline
    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