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. check whether a script exists by script name
Forum Updated to NodeBB v4.3 + New Features

check whether a script exists by script name

Scheduled Pinned Locked Moved Solved General and Desktop
22 Posts 4 Posters 4.3k 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Hi,

    Where is that script supposed to be ?
    Where is your application located ?

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

    U 1 Reply Last reply
    1
    • U user4592357

      i'm on linux, and i need to check whether a script exists.
      at first i used this code:

      auto sUtilName = "some_util";
      QFileInfo fileInfo(sUtilName);
      if (fileInfo.exists())
      	return sUtilName;
      

      actually, i can execute the script by running some_util on terminal, but qt doesn't find it.
      so i had to use full path of the script. but i'd first to check without full path, and if it isn't reachable, only then try full path.

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

      @user4592357 said in check whether a script exists by script name:

      actually, i can execute the script by running some_util on terminal, but qt doesn't find it.

      Is it that some_util is being found on your PATH (from your description this sounds quite likely)? Or (depending on your Linux flavor), if some_util is in the current directory when you type it in a terminal, what is the current directory in the terminal, and what is it when you run your Qt program?

      Please answer @SGaist's questions above.

      1 Reply Last reply
      1
      • SGaistS SGaist

        Hi,

        Where is that script supposed to be ?
        Where is your application located ?

        U Offline
        U Offline
        user4592357
        wrote on last edited by user4592357
        #4

        @SGaist
        i have some env var set, e.g. "export PROG_DIR=/some/path/" which isn't in $PATH, and the script is available at $PROG_DIR/some_util.
        application is located some directory, why does that matter?
        e.g. current dir=/path/, running aaplication: ./sub-dir/app

        JonBJ 1 Reply Last reply
        0
        • U user4592357

          @SGaist
          i have some env var set, e.g. "export PROG_DIR=/some/path/" which isn't in $PATH, and the script is available at $PROG_DIR/some_util.
          application is located some directory, why does that matter?
          e.g. current dir=/path/, running aaplication: ./sub-dir/app

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

          @user4592357
          If the current directory is /path/, and some_util is in $PROG_DIR (where $PROG_DIR is not /path/), going QFileInfo fileInfo("some_util"); is not going to find it. That will only look in whatever the current directory happens to be. And (unless you set it yourself) you don't know what it might be for an end user anyway; searching for a relative pathname is not good, unless you actually intend it only to look in the current directory.

          It sounds like you need to expand (the environment variable in) the $PROG_DIR/some_util to a full path if you expect to pass it to QFileInfo.

          U 1 Reply Last reply
          1
          • JonBJ JonB

            @user4592357
            If the current directory is /path/, and some_util is in $PROG_DIR (where $PROG_DIR is not /path/), going QFileInfo fileInfo("some_util"); is not going to find it. That will only look in whatever the current directory happens to be. And (unless you set it yourself) you don't know what it might be for an end user anyway; searching for a relative pathname is not good, unless you actually intend it only to look in the current directory.

            It sounds like you need to expand (the environment variable in) the $PROG_DIR/some_util to a full path if you expect to pass it to QFileInfo.

            U Offline
            U Offline
            user4592357
            wrote on last edited by
            #6

            @JonB
            ok, then why can i start the script with QProcess::startDetached(progName, args)?

            JonBJ Christian EhrlicherC 2 Replies Last reply
            0
            • U user4592357

              @JonB
              ok, then why can i start the script with QProcess::startDetached(progName, args)?

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

              @user4592357
              Because it's on your PATH?

              What is the "script" anyway? Is it something interpreted by something which looks at that PROG_DIR environment variable? I don't recognise what is using a PROG_DIR environment variable?

              U 1 Reply Last reply
              1
              • U user4592357

                @JonB
                ok, then why can i start the script with QProcess::startDetached(progName, args)?

                Christian EhrlicherC Offline
                Christian EhrlicherC Offline
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by
                #8
                This post is deleted!
                1 Reply Last reply
                0
                • JonBJ JonB

                  @user4592357
                  Because it's on your PATH?

                  What is the "script" anyway? Is it something interpreted by something which looks at that PROG_DIR environment variable? I don't recognise what is using a PROG_DIR environment variable?

                  U Offline
                  U Offline
                  user4592357
                  wrote on last edited by user4592357
                  #9

                  @JonB
                  no the script isn't in $PATH.

                  ok, so at first script isn't available: bash: some_util: command not found
                  i set the env var: export PROG_DIR=/some/path/, now script is available: some_util
                  when i do which some_util, i get the value of $PROG_DIR, i.e. /some/path/

                  JonBJ 1 Reply Last reply
                  0
                  • Christian EhrlicherC Offline
                    Christian EhrlicherC Offline
                    Christian Ehrlicher
                    Lifetime Qt Champion
                    wrote on last edited by
                    #10

                    PROG_DIR is no env var which evaluates something to be available in PATH later on so it must be something special in your setup.

                    1 Reply Last reply
                    2
                    • U user4592357

                      @JonB
                      no the script isn't in $PATH.

                      ok, so at first script isn't available: bash: some_util: command not found
                      i set the env var: export PROG_DIR=/some/path/, now script is available: some_util
                      when i do which some_util, i get the value of $PROG_DIR, i.e. /some/path/

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

                      @user4592357
                      I will look around for PROG_DIR now, because I'm interested. EDIT Couldn't find it anywhere!

                      Meanwhile, for your question, if some_util is not going to be in the current directory, then QFileInfo("some_util") is not going to find it. If it is found in $PROG_DIR then you will need to expand that environment variable in your code before passing to QFileInfo.

                      OOI: can you show us what your PATH environment is before you do anything in a new terminal/shell? From what you described: Does bash allow $PROG_DIR to be "embedded" as an environment variable inside PATH??

                      U 1 Reply Last reply
                      0
                      • JonBJ JonB

                        @user4592357
                        I will look around for PROG_DIR now, because I'm interested. EDIT Couldn't find it anywhere!

                        Meanwhile, for your question, if some_util is not going to be in the current directory, then QFileInfo("some_util") is not going to find it. If it is found in $PROG_DIR then you will need to expand that environment variable in your code before passing to QFileInfo.

                        OOI: can you show us what your PATH environment is before you do anything in a new terminal/shell? From what you described: Does bash allow $PROG_DIR to be "embedded" as an environment variable inside PATH??

                        U Offline
                        U Offline
                        user4592357
                        wrote on last edited by
                        #12

                        @JonB
                        okay i will use full path, that not a problem.

                        i have one more question, so that script actually outputs something, i'm calling it with QProcess::startDetached(progName, args) where args is the args for the script.
                        but since it has output, i wanna suppress it, so i added /dev/null:

                        const auto args = QStringList() <<
                        		... <<
                        		"> /dev/null 2>&1";
                        

                        but it is passed to the script and the script says it's an unknown/unexpected argument. what should i do?

                        JonBJ 1 Reply Last reply
                        0
                        • U user4592357

                          @JonB
                          okay i will use full path, that not a problem.

                          i have one more question, so that script actually outputs something, i'm calling it with QProcess::startDetached(progName, args) where args is the args for the script.
                          but since it has output, i wanna suppress it, so i added /dev/null:

                          const auto args = QStringList() <<
                          		... <<
                          		"> /dev/null 2>&1";
                          

                          but it is passed to the script and the script says it's an unknown/unexpected argument. what should i do?

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

                          @user4592357
                          Once you start using symbols like >, 2>&1 you now cannot try to execute some_util directly. Those are interpreted by the (bash) shell. You will have to achieve a:

                          bash -c 'some_util ... > /dev/null 2>&1'
                          

                          so the executable is bash with two arguments, -c and some_util ... > /dev/null 2>&1 as a single-argument-string.

                          This is getting hairy, and probably not the best way to do it. Better use QProcess stdout/err redirection if that's what you need to achieve.

                          U 1 Reply Last reply
                          1
                          • JonBJ JonB

                            @user4592357
                            Once you start using symbols like >, 2>&1 you now cannot try to execute some_util directly. Those are interpreted by the (bash) shell. You will have to achieve a:

                            bash -c 'some_util ... > /dev/null 2>&1'
                            

                            so the executable is bash with two arguments, -c and some_util ... > /dev/null 2>&1 as a single-argument-string.

                            This is getting hairy, and probably not the best way to do it. Better use QProcess stdout/err redirection if that's what you need to achieve.

                            U Offline
                            U Offline
                            user4592357
                            wrote on last edited by
                            #14

                            @JonB
                            yes, i need to not have output from that script i'm calling. this didn't work, i still get the output:

                            QProcess process;
                            process.setStandardOutputFile(QProcess::nullDevice());
                            if (!process.startDetached(progName, args))
                            ...
                            JonBJ 1 Reply Last reply
                            0
                            • Christian EhrlicherC Offline
                              Christian EhrlicherC Offline
                              Christian Ehrlicher
                              Lifetime Qt Champion
                              wrote on last edited by
                              #15

                              @user4592357 said in check whether a script exists by script name:

                              !process.startDetache

                              QProcess::startDetached() is a static function - if you need something from the process, you have to use QProcess::start() as explained in the documentation

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

                                You're using this static overload which is not the same as this member function.

                                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
                                • U user4592357

                                  @JonB
                                  yes, i need to not have output from that script i'm calling. this didn't work, i still get the output:

                                  QProcess process;
                                  process.setStandardOutputFile(QProcess::nullDevice());
                                  if (!process.startDetached(progName, args))
                                  ...
                                  JonBJ Offline
                                  JonBJ Offline
                                  JonB
                                  wrote on last edited by JonB
                                  #17

                                  @user4592357
                                  In addition to my learned colleague @Christian-Ehrlicher's excellent catch :)
                                  You also need/should call setStandardErrorFile() (or use MergedChannels), in addition to your Output one.

                                  1 Reply Last reply
                                  0
                                  • U Offline
                                    U Offline
                                    user4592357
                                    wrote on last edited by
                                    #18

                                    thanks for the replies, now i have this and it works. is this code okay?

                                    	QProcess process;
                                    	process.closeReadChannel(QProcess::StandardOutput);
                                    	process.start(progPath, args);
                                    	while (!process.atEnd());
                                    	process.close();
                                    

                                    also, why suppress errors? i'd like to see if the called program has any errors.

                                    JonBJ 1 Reply Last reply
                                    0
                                    • U user4592357

                                      thanks for the replies, now i have this and it works. is this code okay?

                                      	QProcess process;
                                      	process.closeReadChannel(QProcess::StandardOutput);
                                      	process.start(progPath, args);
                                      	while (!process.atEnd());
                                      	process.close();
                                      

                                      also, why suppress errors? i'd like to see if the called program has any errors.

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

                                      @user4592357 said in check whether a script exists by script name:

                                      also, why suppress errors? i'd like to see if the called program has any errors.

                                      You wrote

                                      but since it has output, i wanna suppress it

                                      and the code you chose to show had

                                      "> /dev/null 2>&1"
                                      

                                      I was just translating what you wrote, where you are sending stderr to nowhere. It's up to you.

                                      U 1 Reply Last reply
                                      0
                                      • JonBJ JonB

                                        @user4592357 said in check whether a script exists by script name:

                                        also, why suppress errors? i'd like to see if the called program has any errors.

                                        You wrote

                                        but since it has output, i wanna suppress it

                                        and the code you chose to show had

                                        "> /dev/null 2>&1"
                                        

                                        I was just translating what you wrote, where you are sending stderr to nowhere. It's up to you.

                                        U Offline
                                        U Offline
                                        user4592357
                                        wrote on last edited by
                                        #20

                                        @JonB
                                        okay. and above code is okay? specifically, the while (!process.atEnd()); part.

                                        JonBJ 1 Reply Last reply
                                        0
                                        • U user4592357

                                          @JonB
                                          okay. and above code is okay? specifically, the while (!process.atEnd()); part.

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

                                          @user4592357

                                          while (!process.atEnd());

                                          Lord, no, I didn't look! That would occupy all CPU time for parent process!

                                          If you want to do it synchronously that way you must at least use waitForFinished(), see the example & discussion at https://doc.qt.io/qt-5/qprocess.html#synchronous-process-api. It's not the best compared to asynchronous with signal/slot, but I haven't got time, again see the doc if you want to understand.

                                          U 1 Reply Last reply
                                          2

                                          • Login

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