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. how to pipe qprocess' stdout to father process as stdin
Qt 6.11 is out! See what's new in the release blog

how to pipe qprocess' stdout to father process as stdin

Scheduled Pinned Locked Moved Unsolved General and Desktop
37 Posts 4 Posters 24.6k 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.
  • I Isolde

    @JNBarchan said in how to pipe qprocess' stdout to father process as stdin:

    -- but I don't know how easy/possible to connect that to parent's stdin, one usually just uses the resulting data without that. That's what I'm doing at the moment in my own code.

    I know this way, but my situation looks complex, because the library(libmpv) that I used only provides very high level api that only support passing option key-value pairs, so I can only passing a filename string or "-" means stdin. And unfortunately, the data source I need is provide by another program(streamlink), it support stdout. Up to now, I'm using
    streamlink -O | my-qt-program
    to make it work. But I don't deem it a best way. So I want to start streamlink inside my program and pipe its stdout into my-qt-program's stdin. Is it possible?

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #19

    @Isolde If you want to start external program and read its output you can do it very easily using http://doc.qt.io/qt-5/qprocess.html#readyReadStandardOutput and http://doc.qt.io/qt-5/qprocess.html#readAllStandardOutput
    You do not need setStandardOutputProcess for that at all.

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

    I 1 Reply Last reply
    0
    • jsulmJ jsulm

      @Isolde If you want to start external program and read its output you can do it very easily using http://doc.qt.io/qt-5/qprocess.html#readyReadStandardOutput and http://doc.qt.io/qt-5/qprocess.html#readAllStandardOutput
      You do not need setStandardOutputProcess for that at all.

      I Offline
      I Offline
      Isolde
      wrote on last edited by
      #20

      @jsulm My situation is a little complex, I explained in the last reply.

      jsulmJ 1 Reply Last reply
      0
      • I Isolde

        @jsulm My situation is a little complex, I explained in the last reply.

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #21

        @Isolde "So I want to start streamlink inside my program and pipe its stdout into my-qt-program's stdin" - why do you want to pipe it into your stdin instead of simply reading its output like I suggested?

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

        I 1 Reply Last reply
        0
        • jsulmJ jsulm

          @Isolde "So I want to start streamlink inside my program and pipe its stdout into my-qt-program's stdin" - why do you want to pipe it into your stdin instead of simply reading its output like I suggested?

          I Offline
          I Offline
          Isolde
          wrote on last edited by
          #22

          @jsulm Because libmpv only support passing filename string or "-" that means read from stdin...

          1 Reply Last reply
          0
          • I Isolde

            @JNBarchan said in how to pipe qprocess' stdout to father process as stdin:

            -- but I don't know how easy/possible to connect that to parent's stdin, one usually just uses the resulting data without that. That's what I'm doing at the moment in my own code.

            I know this way, but my situation looks complex, because the library(libmpv) that I used only provides very high level api that only support passing option key-value pairs, so I can only passing a filename string or "-" means stdin. And unfortunately, the data source I need is provide by another program(streamlink), it support stdout. Up to now, I'm using
            streamlink -O | my-qt-program
            to make it work. But I don't deem it a best way. So I want to start streamlink inside my program and pipe its stdout into my-qt-program's stdin. Is it possible?

            JonBJ Online
            JonBJ Online
            JonB
            wrote on last edited by
            #23

            @Isolde said in how to pipe qprocess' stdout to father process as stdin:

            So I want to start streamlink inside my program and pipe its stdout into my-qt-program's stdin. Is it possible?

            That's why I wrote earlier "but I don't know how easy/possible to connect that to parent's stdin". Neither I nor seemingly @jsulm know how to change a running Qt program's stdin.

            You may safely assume that the QProcess approach is not going to work in the running parent program. One can guess that this refers to only a "sub-process", not the current process. I know what sort of code they will have written for the redirection, and they will be offering it only as they start a sub-process. What you need is a "redirect current stdin" call, and I don't see Qt offering that.

            If you are Linux only, I can tell you how to do it in C, which will presumably be reflected in C++, or you could look that up. I think it will "work" in that Qt's stdin will reflect the change, but you would not be doing the redirection or the sub-process spawning as Qt calls. Which may not be attractive.

            Alternatively you can write simple shell scripts as a "wrapper" when launching your Qt application. You could even write another small Qt application to invoke your current Qt application in the right way if you prefer!

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

              Hi,

              As already suggested, you can use QProcess and its channels communication API to process the output of mpv within your application. From the looks of it, there's no need for piping anything.

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

              I 1 Reply Last reply
              0
              • SGaistS SGaist

                Hi,

                As already suggested, you can use QProcess and its channels communication API to process the output of mpv within your application. From the looks of it, there's no need for piping anything.

                I Offline
                I Offline
                Isolde
                wrote on last edited by
                #25

                @SGaist But what I want is to input data into libmpv...

                1 Reply Last reply
                1
                • JonBJ JonB

                  @Isolde said in how to pipe qprocess' stdout to father process as stdin:

                  So I want to start streamlink inside my program and pipe its stdout into my-qt-program's stdin. Is it possible?

                  That's why I wrote earlier "but I don't know how easy/possible to connect that to parent's stdin". Neither I nor seemingly @jsulm know how to change a running Qt program's stdin.

                  You may safely assume that the QProcess approach is not going to work in the running parent program. One can guess that this refers to only a "sub-process", not the current process. I know what sort of code they will have written for the redirection, and they will be offering it only as they start a sub-process. What you need is a "redirect current stdin" call, and I don't see Qt offering that.

                  If you are Linux only, I can tell you how to do it in C, which will presumably be reflected in C++, or you could look that up. I think it will "work" in that Qt's stdin will reflect the change, but you would not be doing the redirection or the sub-process spawning as Qt calls. Which may not be attractive.

                  Alternatively you can write simple shell scripts as a "wrapper" when launching your Qt application. You could even write another small Qt application to invoke your current Qt application in the right way if you prefer!

                  I Offline
                  I Offline
                  Isolde
                  wrote on last edited by
                  #26

                  @JNBarchan Thank you for your patient help, I'll write a shell script to wrap them.

                  JonBJ 1 Reply Last reply
                  1
                  • I Isolde

                    @JNBarchan Thank you for your patient help, I'll write a shell script to wrap them.

                    JonBJ Online
                    JonBJ Online
                    JonB
                    wrote on last edited by
                    #27

                    @Isolde
                    I do think if you can manage with that it will be a lot simpler than trying to do it from Qt.

                    Now that I have understood your objective, I will say that there is nothing wrong about it as a desired facility in Qt. However, so far as I can see (and I have Googled a lot) Qt does not offer any means of redirecting a parent process's (not QProcess) own stdin/stdout/stderr from/to a piped child process, and that is actually a lacking feature in its otherwise comprehensive library.

                    I 1 Reply Last reply
                    0
                    • JonBJ JonB

                      @Isolde
                      I do think if you can manage with that it will be a lot simpler than trying to do it from Qt.

                      Now that I have understood your objective, I will say that there is nothing wrong about it as a desired facility in Qt. However, so far as I can see (and I have Googled a lot) Qt does not offer any means of redirecting a parent process's (not QProcess) own stdin/stdout/stderr from/to a piped child process, and that is actually a lacking feature in its otherwise comprehensive library.

                      I Offline
                      I Offline
                      Isolde
                      wrote on last edited by
                      #28

                      @JNBarchan I found a workaround.
                      Now I using QProcess's startDetached() like

                              QProcess* restart;
                              restart = new QProcess;
                              restart->startDetached("bash -c \"streamlink -O | my-qt-program \"");
                              exit(0);
                      

                      It works well!

                      JonBJ 1 Reply Last reply
                      0
                      • I Isolde

                        @JNBarchan I found a workaround.
                        Now I using QProcess's startDetached() like

                                QProcess* restart;
                                restart = new QProcess;
                                restart->startDetached("bash -c \"streamlink -O | my-qt-program \"");
                                exit(0);
                        

                        It works well!

                        JonBJ Online
                        JonBJ Online
                        JonB
                        wrote on last edited by JonB
                        #29

                        @Isolde
                        Yes, you mean, you have written that as a second Qt application which does this to invoke your original Qt application, instead of a script file. Which is what we were suggesting :) [EDIT: Or, do you mean you actually do this from within your original "my-qt-program"?]

                        jsulmJ I 2 Replies Last reply
                        2
                        • JonBJ JonB

                          @Isolde
                          Yes, you mean, you have written that as a second Qt application which does this to invoke your original Qt application, instead of a script file. Which is what we were suggesting :) [EDIT: Or, do you mean you actually do this from within your original "my-qt-program"?]

                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on last edited by
                          #30

                          @JNBarchan said in how to pipe qprocess' stdout to father process as stdin:

                          Or, do you mean you actually do this from within your original "my-qt-program

                          That would be an endless loop :-)

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

                          I JonBJ 2 Replies Last reply
                          0
                          • JonBJ JonB

                            @Isolde
                            Yes, you mean, you have written that as a second Qt application which does this to invoke your original Qt application, instead of a script file. Which is what we were suggesting :) [EDIT: Or, do you mean you actually do this from within your original "my-qt-program"?]

                            I Offline
                            I Offline
                            Isolde
                            wrote on last edited by
                            #31

                            @JNBarchan said in how to pipe qprocess' stdout to father process as stdin:

                            is

                            Not quite. I just add a simple if statement that determine whether to execute this restart code like

                                if(QCoreApplication::arguments().at(1) != "bypass-parser")
                                {
                                    QProcess* restart;
                                    restart = new QProcess;
                                    restart->startDetached("bash -c \"streamlink " + parser.value(urlOption) + " " + parser.value(streamOption) + " -O | " + QCoreApplication::applicationFilePath() + " bypass-parser " + parser.value(urlOption) + "\"");
                                    exit(0);
                                }
                            
                            1 Reply Last reply
                            0
                            • jsulmJ jsulm

                              @JNBarchan said in how to pipe qprocess' stdout to father process as stdin:

                              Or, do you mean you actually do this from within your original "my-qt-program

                              That would be an endless loop :-)

                              I Offline
                              I Offline
                              Isolde
                              wrote on last edited by
                              #32

                              @jsulm I'm sorry. They are not the whole codes, I post them completely in the last reply.

                              jsulmJ 1 Reply Last reply
                              0
                              • I Isolde

                                @jsulm I'm sorry. They are not the whole codes, I post them completely in the last reply.

                                jsulmJ Offline
                                jsulmJ Offline
                                jsulm
                                Lifetime Qt Champion
                                wrote on last edited by
                                #33

                                @Isolde You should not exit a Qt app like this, use http://doc.qt.io/qt-5/qcoreapplication.html#exit instead. Also there is no need to allocate QProcess on the heap. And in this particular case there is even no need for a QProcess instance at all as startDetached is static:

                                if(QCoreApplication::arguments().at(1) != "bypass-parser")
                                {
                                    QProcess::startDetached("bash -c \"streamlink " + parser.value(urlOption) + " " + parser.value(streamOption) + " -O | " +     QCoreApplication::applicationFilePath() + " bypass-parser " + parser.value(urlOption) + "\"");
                                    QCoreApplication::exit(0);
                                }

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

                                I 2 Replies Last reply
                                3
                                • jsulmJ jsulm

                                  @Isolde You should not exit a Qt app like this, use http://doc.qt.io/qt-5/qcoreapplication.html#exit instead. Also there is no need to allocate QProcess on the heap. And in this particular case there is even no need for a QProcess instance at all as startDetached is static:

                                  if(QCoreApplication::arguments().at(1) != "bypass-parser")
                                  {
                                      QProcess::startDetached("bash -c \"streamlink " + parser.value(urlOption) + " " + parser.value(streamOption) + " -O | " +     QCoreApplication::applicationFilePath() + " bypass-parser " + parser.value(urlOption) + "\"");
                                      QCoreApplication::exit(0);
                                  }
                                  I Offline
                                  I Offline
                                  Isolde
                                  wrote on last edited by
                                  #34

                                  @jsulm Got it. I'll amend it. Thank you very much.

                                  1 Reply Last reply
                                  1
                                  • jsulmJ jsulm

                                    @JNBarchan said in how to pipe qprocess' stdout to father process as stdin:

                                    Or, do you mean you actually do this from within your original "my-qt-program

                                    That would be an endless loop :-)

                                    JonBJ Online
                                    JonBJ Online
                                    JonB
                                    wrote on last edited by
                                    #35

                                    @jsulm said in how to pipe qprocess' stdout to father process as stdin:

                                    @JNBarchan said in how to pipe qprocess' stdout to father process as stdin:

                                    Or, do you mean you actually do this from within your original "my-qt-program

                                    That would be an endless loop :-)

                                    That's why I asked, and he has posted to show how he detects....

                                    1 Reply Last reply
                                    0
                                    • jsulmJ jsulm

                                      @Isolde You should not exit a Qt app like this, use http://doc.qt.io/qt-5/qcoreapplication.html#exit instead. Also there is no need to allocate QProcess on the heap. And in this particular case there is even no need for a QProcess instance at all as startDetached is static:

                                      if(QCoreApplication::arguments().at(1) != "bypass-parser")
                                      {
                                          QProcess::startDetached("bash -c \"streamlink " + parser.value(urlOption) + " " + parser.value(streamOption) + " -O | " +     QCoreApplication::applicationFilePath() + " bypass-parser " + parser.value(urlOption) + "\"");
                                          QCoreApplication::exit(0);
                                      }
                                      I Offline
                                      I Offline
                                      Isolde
                                      wrote on last edited by
                                      #36

                                      @jsulm said in how to pipe qprocess' stdout to father process as stdin:

                                      @Isolde You should not exit a Qt app like this, use http://doc.qt.io/qt-5/qcoreapplication.html#exit instead. Also there is no need to allocate QProcess on the heap. And in this particular case there is even no need for a QProcess instance at all as startDetached is static:

                                      if(QCoreApplication::arguments().at(1) != "bypass-parser")
                                      {
                                          QProcess::startDetached("bash -c \"streamlink " + parser.value(urlOption) + " " + parser.value(streamOption) + " -O | " +     QCoreApplication::applicationFilePath() + " bypass-parser " + parser.value(urlOption) + "\"");
                                          QCoreApplication::exit(0);
                                      }
                                      

                                      There is a strange problem, my program won't exit with QCoreApplication::exit(0);(but it could exit normally with exit(0)), I saw two windows with QCoreApplication::exit(0);. And the terminal output indicated that the old process had run into the GUI drawing step.

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

                                        So you want to control mpv from your 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

                                        • Login

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