Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Language Bindings
  4. QIODevice::read (QProcess): device not open
Forum Updated to NodeBB v4.3 + New Features

QIODevice::read (QProcess): device not open

Scheduled Pinned Locked Moved Solved Language Bindings
19 Posts 3 Posters 10.5k Views 1 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #9

    What does the script you launch do ?

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • F Offline
      F Offline
      FoxBandyKoot
      wrote on last edited by
      #10

      It makes a count of how many times employes choosed have worked together, based on a xlsx file. Finally return this number (that I cast to string before)

      Sorry for faults, I'm not english :/ And thanks you really for taking time to help me ^^

      # version with 1 parameter
      def __main__(employesChoisis):
          total = Tabstats(employesChoisis)
          str(total)
          
          return total
      
      JonBJ 1 Reply Last reply
      0
      • F FoxBandyKoot

        It makes a count of how many times employes choosed have worked together, based on a xlsx file. Finally return this number (that I cast to string before)

        Sorry for faults, I'm not english :/ And thanks you really for taking time to help me ^^

        # version with 1 parameter
        def __main__(employesChoisis):
            total = Tabstats(employesChoisis)
            str(total)
            
            return total
        
        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by JonB
        #11

        @FoxBandyKoot

        Finally return this number (that I cast to string before)

        This may not be relevant to whatever your problem is, but:

            total = Tabstats(employesChoisis)
            str(total)
            
            return total
        

        This does not "cast the string before returning as a result". Python str() is a function returning a string. It does not change its argument. Your standalone str(total) line has no side-effects. Your function returns whatever type is returned from Tabstats(). If you need to force-convert return result to a string: return str(total).

        F 1 Reply Last reply
        3
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #12

          Do you have the same problem if you run a dummy python application ?

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          0
          • JonBJ JonB

            @FoxBandyKoot

            Finally return this number (that I cast to string before)

            This may not be relevant to whatever your problem is, but:

                total = Tabstats(employesChoisis)
                str(total)
                
                return total
            

            This does not "cast the string before returning as a result". Python str() is a function returning a string. It does not change its argument. Your standalone str(total) line has no side-effects. Your function returns whatever type is returned from Tabstats(). If you need to force-convert return result to a string: return str(total).

            F Offline
            F Offline
            FoxBandyKoot
            wrote on last edited by
            #13

            @JonB

            Okay so I changed it, thanks you !

            @SGaist
            I created a test.py just for test :

            def __main__(employesChoisis):
                
                
                return "TEST"
            

            Same error :/

            JonBJ 1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #14

              And if you just start a normal command line tool like dir ?

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              1
              • F FoxBandyKoot

                @JonB

                Okay so I changed it, thanks you !

                @SGaist
                I created a test.py just for test :

                def __main__(employesChoisis):
                    
                    
                    return "TEST"
                

                Same error :/

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by
                #15

                @FoxBandyKoot
                The problem is what I see in the debugger output window is happening while you try to run/debug your program, right? You could put messages in/tell us where exactly you receive the warnings as you step through the code....

                Right, I am now peering at the screenshot code you are using.

                1. Remove/comment out
                 _process.setReadChannel(StandardOutput);                    // OPEN CHANNEL FOR READ
                    _process.closeReadChannel(StandardOutput);                      // Stop read
                
                

                I am hoping that will get rid of the nasty output?

                1. Your parent program is intended to read whatever the sub-process sends to its stdout. Yours is sending nothing. You cannot "return a string" like "TEST" from any program, Python or otherwise (you can only return an integer). Your test.py should probably be going print("HELLO") (Python 3), for what you want.
                1 Reply Last reply
                1
                • F Offline
                  F Offline
                  FoxBandyKoot
                  wrote on last edited by
                  #16

                  @SGaist
                  I tried to launch "dir" but nothing is happening

                  0_1539443911364_fea54747-28f1-4369-b3c2-08181888146f-image.png

                  @JonB
                  Yes that's it, when I debug I can see this error, on instruction readAllStandardOutput();
                  And the application crash...

                  0_1539444144651_d52f806f-9b41-4599-9778-c39cd31d1d50-image.png

                  If I'm not in debug mode, program continues... that's really weird
                  And when this instruction happens :

                  ui->labelResult->setText(p_stdout); // display output
                  

                  Nothing appears. I don't understand why I should comment out functions which open and close channels... My true script return henceforth a integer :
                  0_1539444768297_95e358f5-0c6d-4a96-9e72-797e5d36f199-image.png

                  You want me to show you the code that precedes the script?

                  JonBJ 1 Reply Last reply
                  0
                  • F FoxBandyKoot

                    @SGaist
                    I tried to launch "dir" but nothing is happening

                    0_1539443911364_fea54747-28f1-4369-b3c2-08181888146f-image.png

                    @JonB
                    Yes that's it, when I debug I can see this error, on instruction readAllStandardOutput();
                    And the application crash...

                    0_1539444144651_d52f806f-9b41-4599-9778-c39cd31d1d50-image.png

                    If I'm not in debug mode, program continues... that's really weird
                    And when this instruction happens :

                    ui->labelResult->setText(p_stdout); // display output
                    

                    Nothing appears. I don't understand why I should comment out functions which open and close channels... My true script return henceforth a integer :
                    0_1539444768297_95e358f5-0c6d-4a96-9e72-797e5d36f199-image.png

                    You want me to show you the code that precedes the script?

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by JonB
                    #17

                    @FoxBandyKoot
                    1.

                    I tried to launch "dir" but nothing is happening

                    How do you know "nothing is happening" from such a command? Since you're not collecting the output, what do you expect to see?

                    I don't understand why I should comment out functions which open and close channels...

                    Because I don't think you want them, and I don't think it should be done that way, period. I've never used it and had no problems. Why not try?

                    1. _process.readAllStandardOutput()

                    this function returns all data available from the standard output of the process

                    Since you have only done _process.waitForStarted(), how do you know there is any output yet available to read?

                    1 Reply Last reply
                    1
                    • F Offline
                      F Offline
                      FoxBandyKoot
                      wrote on last edited by
                      #18
                      1. I thinked that I could see content of directory where the script is located in the pyzo interpreter :
                        0_1539508130846_b43f7eff-f3df-4434-9cbf-99218a6986fc-image.png

                      2. So I tried to comment out these functions :

                              _process.setReadChannel(StandardOutput);                    // OPEN CHANNEL FOR READ
                      
                              _process.closeReadChannel(StandardOutput);                      // Stop read
                      

                      And the application doesn't crash anymore either in debug mode or not ! But the return value in "p_stdout" is null.

                      1. how do you know there is any output yet available to read?

                      In my new code I try to implement

                      waitForReadyRead and waitForBytesWritten but I don't pass into these functions, I don't know why :/

                      Only waitForStarted return true, so the first readAllStandardOutput happens but return nothing from true script or test script.

                      #include "ui_tabtstatemp_countworktogether.h"
                      
                      #include <QMessageBox>
                      #include <QDebug>
                      
                      TabtStatEmp_CountWorkTogether::TabtStatEmp_CountWorkTogether(QString file_path, QString script_path, QString employesDesires, QWidget *parent) :
                          QDialog(parent),
                          ui(new Ui::TabtStatEmp_CountWorkTogether)
                      
                      {
                      
                          ui->setupUi(this);
                      
                      // OPEN XLS FILE
                          
                          QFile xslFile(file_path);
                          xslFile.open(QIODevice::ReadOnly | QIODevice::Text);
                      
                      
                      // EXEC PYTHON SCRIPT
                      
                      
                         // QStringList args = (QStringList() << script_path << employesDesires << file_path) ; // parameters on final version
                      //    QStringList args = (QStringList() << script_path << employesDesires ) ; // second try with just one parameter
                          QStringList args = (QStringList() << script_path << employesDesires ) ; // first try without parameter
                      
                          QString program = "Python";                                                         // program
                      
                          QString p_stdout;
                      
                          _process.start(program, args );                                 // START PROG
                      
                          if (_process.waitForStarted()){                                 // Check if python is running
                      
                              QMessageBox::warning(this,tr("Have started"), tr("Have started"));
                      
                      //        _process.setReadChannel(StandardOutput);                    // OPEN CHANNEL FOR READ
                      
                              p_stdout = _process.readAllStandardOutput();                // get output
                      
                              if (_process.waitForReadyRead(10000)){                                 // 10 sec to check if data is ready
                                  QMessageBox::warning(this,tr("Data ready"), tr("Data ready"));
                      
                                  p_stdout = _process.readAllStandardOutput();                // get output
                      
                      
                                  if (_process.waitForBytesWritten(10000)){     // 10 sec to check if data is written
                                      QMessageBox::warning(this,tr("Data written"), tr("Data written"));
                      
                                  }
                              }
                      
                      
                          }
                      
                      //    _process.closeReadChannel(StandardOutput);                      // CLOSE CHANNEL FOR READ
                      
                          QMessageBox::warning(this,tr("Have ended"), tr("Have ended"));
                      
                          ui->labelResult->setText(p_stdout); // display output
                      
                          if (!_process.waitForFinished()){                               // If process crash, stop it
                              return;
                          }
                      }
                      
                      
                      
                      
                      // DESTRUCTOR
                      TabtStatEmp_CountWorkTogether::~TabtStatEmp_CountWorkTogether()
                      {
                          delete ui;
                      }
                      
                      1 Reply Last reply
                      0
                      • F Offline
                        F Offline
                        FoxBandyKoot
                        wrote on last edited by
                        #19

                        **My first problem has been resolved, so I will close this, and open a topic for my new problem.

                        For future people who come to this topic : The solution for "Device not open" was to use "start function" instead of "execute function".

                        Thank you people for helping me.**

                        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