Home > Back-end >  QT plain command execution like system
QT plain command execution like system

Time:01-06

I have a pretty complicate command list, which loads a virtual env and executes several commands on a given text. It works fine with system() but fails with QProcess::execute. This is a bummer since I want to use

QProcess process; 
process.readAllStandardOutput();

to read the output without messing with pipes. Is there a way to give a process just a "stupid" command string, which it executes like system() ?

command = "bash -c \""   prepend   "\\\""    text   "\\\""   append   "\"";

std::cout << command.toStdString().c_str() << std::endl;

//qDebug() << QProcess::execute(command.toStdString().c_str());
system(command.toStdString().c_str());

QT seems to mess up the parameters:

usage: program_name [-h] [--list_models [LIST_MODELS]] [--text TEXT]

Edit1: solution with popen (ugly but working):

FILE *fp;
char path[1035];
fp = popen(command.toStdString().c_str(), "r");
if (fp == NULL)
{
    printf("Failed to run command\n" );
    exit(1);
}

while (fgets(path, sizeof(path), fp) != NULL)
{
    QString line = path;
    if(line.contains("Keyword"))
    {
        qDebug() << "=============================";
        qDebug() << line;
        qDebug() << "=============================";
    }
}

pclose(fp);

Edit2: Requested debug output

programm_name started
bash -x -c "source /home/myusername/anaconda3/bin/activate; conda activate myenv; programm_name --text \"test\" --model_name tts_models/en/ljspeech/tacotron2-DCA --vocoder_name vocoder_models/en/ljspeech/mulitband-melgan --out_path /home/myusername/projects/tts/soundoutput/"
  unset _mlre _mlIFS _mlshdbg
  '[' 0 = 1 ']'
  '[' -n x ']'
  _mlIFS='  
'
  IFS=' '
  '[' -n '' ']'
   /usr/bin/tclsh /usr/lib/x86_64-linux-gnu/modulecmd.tcl bash autoinit
  eval 'module()' '{
' unset _mlre _mlIFS '_mlshdbg;
' if '[' '"${MODULES_SILENT_SHELL_DEBUG:-0}"' = ''\''1'\''' '];' 'then
' case '"$-"' 'in
' '*v*x*)' set ' vx;' '_mlshdbg='\''vx'\''' ';;
' '*v*)' set ' v;' '_mlshdbg='\''v'\''' ';;
' '*x*)' set ' x;' '_mlshdbg='\''x'\''' ';;
' '*)' '_mlshdbg='\'''\''' ';;
' 'esac;
' 'fi;
' if '[' -n '"${IFS x}"' '];' 'then
' '_mlIFS=$IFS;
' 'fi;
' 'IFS='\''' ''\'';
' for _mlv in '${MODULES_RUN_QUARANTINE:-};' 'do
' if '[' '"${_mlv}"' = '"${_mlv##*[!A-Za-z0-9_]}"' -a '"${_mlv}"' = '"${_mlv#[0-9]}"' '];' 'then
' if '[' -n '"`eval' ''\''echo' '${'\''$_mlv'\'' x}'\''`"' '];' 'then
' '_mlre="${_mlre:-}${_mlv}_modquar='\''`eval' ''\''echo' '${'\''$_mlv'\''}'\''`'\''' '";
' 'fi;
' '_mlrv="MODULES_RUNENV_${_mlv}";
' '_mlre="${_mlre:-}${_mlv}='\''`eval' ''\''echo' '${'\''$_mlrv'\'':-}'\''`'\''' '";
' 'fi;
' 'done;
' if '[' -n '"${_mlre:-}"' '];' 'then
' '_mlre="eval' '${_mlre}";
' 'fi;
' eval '`${_mlre:-}/usr/bin/tclsh' /usr/lib/x86_64-linux-gnu/modulecmd.tcl bash '$*`;
' '_mlstatus=$?;
' if '[' -n '"${_mlIFS x}"' '];' 'then
' 'IFS=$_mlIFS;
' 'else
' unset 'IFS;
' 'fi;
' if '[' -n '"${_mlshdbg:-}"' '];' 'then
' set '-$_mlshdbg;
' 'fi;
' unset _mlre _mlv _mlrv _mlIFS '_mlshdbg;
' return '$_mlstatus;
};
MODULES_CMD=/usr/lib/x86_64-linux-gnu/modulecmd.tcl;' export 'MODULES_CMD;
MODULESHOME=/usr/share/modules;' export 'MODULESHOME;
test' '0;'
   MODULES_CMD=/usr/lib/x86_64-linux-gnu/modulecmd.tcl
   export MODULES_CMD
   MODULESHOME=/usr/share/modules
   export MODULESHOME
   test 0
  '[' -n x ']'
  IFS='     
'
  unset _mlIFS
  unset _mlre _mlv _mlrv
  '[' 0 = 1 ']'
  '[' -t 1 ']'
  export -f module
  export -f switchml
  ENV=/usr/share/modules/init/profile.sh
  export ENV
  BASH_ENV=/usr/share/modules/init/bash
  export BASH_ENV
  '[' 4 -ge 3 ']'
  [[ hxBc =~ i ]]
  [[ ! :/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin: =~ :/usr/bin: ]]
   manpath
  manpath=/usr/share/man:/usr/local/man:/usr/local/share/man
  [[ ! :/usr/share/man:/usr/local/man:/usr/local/share/man: =~ :/usr/share/man: ]]
  '[' -n '' ']'
  source /home/myusername/anaconda3/bin/activate
   _CONDA_ROOT=/home/myusername/anaconda3
   . /home/myusername/anaconda3/etc/profile.d/conda.sh
    export CONDA_EXE=/home/myusername/anaconda3/bin/conda
    CONDA_EXE=/home/myusername/anaconda3/bin/conda
    export _CE_M=
    _CE_M=
    export _CE_CONDA=
    _CE_CONDA=
    export CONDA_PYTHON_EXE=/home/myusername/anaconda3/bin/python
    CONDA_PYTHON_EXE=/home/myusername/anaconda3/bin/python
    '[' -z '' ']'
    export CONDA_SHLVL=0
    CONDA_SHLVL=0
    '[' -n '' ']'
      dirname /home/myusername/anaconda3/bin/conda
     dirname /home/myusername/anaconda3/bin
    PATH=/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    export PATH
    '[' -z '' ']'
    PS1=
   conda activate
   '[' 1 -lt 1 ']'
   local cmd=activate
   shift
   case "$cmd" in
   __conda_activate activate
   '[' -n '' ']'
   local cmd=activate
   shift
   local ask_conda
   CONDA_INTERNAL_OLDPATH=/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
   __add_sys_prefix_to_path
   '[' -n '' ']'
    dirname /home/myusername/anaconda3/bin/conda
   SYSP=/home/myusername/anaconda3/bin
    dirname /home/myusername/anaconda3/bin
   SYSP=/home/myusername/anaconda3
   '[' -n '' ']'
   PATH=/home/myusername/anaconda3/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
   export PATH
    PS1=
    /home/myusername/anaconda3/bin/conda shell.posix activate
   ask_conda='PS1='\''(base) '\''
export PATH='\''/home/myusername/anaconda3/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'\''
export CONDA_PREFIX='\''/home/myusername/anaconda3'\''
export CONDA_SHLVL='\''1'\''
export CONDA_DEFAULT_ENV='\''base'\''
export CONDA_PROMPT_MODIFIER='\''(base) '\''
export CONDA_EXE='\''/home/myusername/anaconda3/bin/conda'\''
export _CE_M='\'''\''
export _CE_CONDA='\'''\''
export CONDA_PYTHON_EXE='\''/home/myusername/anaconda3/bin/python'\'''
   rc=0
   PATH=/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
   eval 'PS1='\''(base) '\''
export PATH='\''/home/myusername/anaconda3/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'\''
export CONDA_PREFIX='\''/home/myusername/anaconda3'\''
export CONDA_SHLVL='\''1'\''
export CONDA_DEFAULT_ENV='\''base'\''
export CONDA_PROMPT_MODIFIER='\''(base) '\''
export CONDA_EXE='\''/home/myusername/anaconda3/bin/conda'\''
export _CE_M='\'''\''
export _CE_CONDA='\'''\''
export CONDA_PYTHON_EXE='\''/home/myusername/anaconda3/bin/python'\'''
    PS1='(base) '
    export PATH=/home/myusername/anaconda3/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    PATH=/home/myusername/anaconda3/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    export CONDA_PREFIX=/home/myusername/anaconda3
    CONDA_PREFIX=/home/myusername/anaconda3
    export CONDA_SHLVL=1
    CONDA_SHLVL=1
    export CONDA_DEFAULT_ENV=base
    CONDA_DEFAULT_ENV=base
    export 'CONDA_PROMPT_MODIFIER=(base) '
    CONDA_PROMPT_MODIFIER='(base) '
    export CONDA_EXE=/home/myusername/anaconda3/bin/conda
    CONDA_EXE=/home/myusername/anaconda3/bin/conda
    export _CE_M=
    _CE_M=
    export _CE_CONDA=
    _CE_CONDA=
    export CONDA_PYTHON_EXE=/home/myusername/anaconda3/bin/python
    CONDA_PYTHON_EXE=/home/myusername/anaconda3/bin/python
   '[' 0 '!=' 0 ']'
   __conda_hashr
   '[' -n '' ']'
   '[' -n '' ']'
   hash -r
  conda activate myenv
  '[' 2 -lt 1 ']'
  local cmd=activate
  shift
  case "$cmd" in
  __conda_activate activate myenv
  '[' -n '' ']'
  local cmd=activate
  shift
  local ask_conda
  CONDA_INTERNAL_OLDPATH=/home/myusername/anaconda3/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  __add_sys_prefix_to_path
  '[' -n '' ']'
   dirname /home/myusername/anaconda3/bin/conda
  SYSP=/home/myusername/anaconda3/bin
   dirname /home/myusername/anaconda3/bin
  SYSP=/home/myusername/anaconda3
  '[' -n '' ']'
  PATH=/home/myusername/anaconda3/bin:/home/myusername/anaconda3/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  export PATH
   PS1='(base) '
   /home/myusername/anaconda3/bin/conda shell.posix activate myenv
  ask_conda='PS1='\''(myenv) '\''
export PATH='\''/home/myusername/anaconda3/envs/myenv/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'\''
export CONDA_PREFIX='\''/home/myusername/anaconda3/envs/myenv'\''
export CONDA_SHLVL='\''2'\''
export CONDA_DEFAULT_ENV='\''myenv'\''
export CONDA_PROMPT_MODIFIER='\''(myenv) '\''
export CONDA_EXE='\''/home/myusername/anaconda3/bin/conda'\''
export _CE_M='\'''\''
export _CE_CONDA='\'''\''
export CONDA_PYTHON_EXE='\''/home/myusername/anaconda3/bin/python'\''
export CONDA_PREFIX_1='\''/home/myusername/anaconda3'\''
. "/home/myusername/anaconda3/envs/myenv/etc/conda/activate.d/mpivars.activate.sh"'
  rc=0
  PATH=/home/myusername/anaconda3/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  eval 'PS1='\''(myenv) '\''
export PATH='\''/home/myusername/anaconda3/envs/myenv/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'\''
export CONDA_PREFIX='\''/home/myusername/anaconda3/envs/myenv'\''
export CONDA_SHLVL='\''2'\''
export CONDA_DEFAULT_ENV='\''myenv'\''
export CONDA_PROMPT_MODIFIER='\''(myenv) '\''
export CONDA_EXE='\''/home/myusername/anaconda3/bin/conda'\''
export _CE_M='\'''\''
export _CE_CONDA='\'''\''
export CONDA_PYTHON_EXE='\''/home/myusername/anaconda3/bin/python'\''
export CONDA_PREFIX_1='\''/home/myusername/anaconda3'\''
. "/home/myusername/anaconda3/envs/myenv/etc/conda/activate.d/mpivars.activate.sh"'
   PS1='(myenv) '
   export PATH=/home/myusername/anaconda3/envs/myenv/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
   PATH=/home/myusername/anaconda3/envs/myenv/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
   export CONDA_PREFIX=/home/myusername/anaconda3/envs/myenv
   CONDA_PREFIX=/home/myusername/anaconda3/envs/myenv
   export CONDA_SHLVL=2
   CONDA_SHLVL=2
   export CONDA_DEFAULT_ENV=myenv
   CONDA_DEFAULT_ENV=myenv
   export 'CONDA_PROMPT_MODIFIER=(myenv) '
   CONDA_PROMPT_MODIFIER='(myenv) '
   export CONDA_EXE=/home/myusername/anaconda3/bin/conda
   CONDA_EXE=/home/myusername/anaconda3/bin/conda
   export _CE_M=
   _CE_M=
   export _CE_CONDA=
   _CE_CONDA=
   export CONDA_PYTHON_EXE=/home/myusername/anaconda3/bin/python
   CONDA_PYTHON_EXE=/home/myusername/anaconda3/bin/python
   export CONDA_PREFIX_1=/home/myusername/anaconda3
   CONDA_PREFIX_1=/home/myusername/anaconda3
   . /home/myusername/anaconda3/envs/myenv/etc/conda/activate.d/mpivars.activate.sh
    '[' '' '!=' 1 ']'
    export I_MPI_ROOT=/home/myusername/anaconda3/envs/myenv
    I_MPI_ROOT=/home/myusername/anaconda3/envs/myenv
    '[' -z '' ']'
    export CLASSPATH=/home/myusername/anaconda3/envs/myenv/lib/mpi.jar
    CLASSPATH=/home/myusername/anaconda3/envs/myenv/lib/mpi.jar
    '[' -z '' ']'
     manpath
    export MANPATH=/home/myusername/anaconda3/envs/myenv/share/man:/home/myusername/anaconda3/envs/myenv/man:/home/myusername/anaconda3/man:/usr/share/man:/usr/local/man:/usr/local/share/man
    MANPATH=/home/myusername/anaconda3/envs/myenv/share/man:/home/myusername/anaconda3/envs/myenv/man:/home/myusername/anaconda3/man:/usr/share/man:/usr/local/man:/usr/local/share/man
    '[' -z '' ']'
    i_mpi_ofi_library_internal=1
    case "$i_mpi_ofi_library_internal" in
    export PATH=/home/myusername/anaconda3/envs/myenv/bin/libfabric:/home/myusername/anaconda3/envs/myenv/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    PATH=/home/myusername/anaconda3/envs/myenv/bin/libfabric:/home/myusername/anaconda3/envs/myenv/bin:/home/myusername/anaconda3/condabin:/usr/lib/qt5/bin:/usr/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    export LD_LIBRARY_PATH=/home/myusername/anaconda3/envs/myenv/lib/libfabric:/usr/lib/x86_64-linux-gnu
    LD_LIBRARY_PATH=/home/myusername/anaconda3/envs/myenv/lib/libfabric:/usr/lib/x86_64-linux-gnu
    '[' -z '' ']'
    export LIBRARY_PATH=/home/myusername/anaconda3/envs/myenv/lib/libfabric
    LIBRARY_PATH=/home/myusername/anaconda3/envs/myenv/lib/libfabric
    export FI_PROVIDER_PATH=/home/myusername/anaconda3/envs/myenv/lib/libfabric/prov:/usr/lib64/libfabric
    FI_PROVIDER_PATH=/home/myusername/anaconda3/envs/myenv/lib/libfabric/prov:/usr/lib64/libfabric
  '[' 0 '!=' 0 ']'
  __conda_hashr
  '[' -n '' ']'
  '[' -n '' ']'
  hash -r
  programm_name --text 'test --model_name' tts_models/en/ljspeech/tacotron2-DCA --vocoder_name vocoder_models/en/ljspeech/mulitband-melgan --out_path /home/myusername/projects/tts/soundoutput/
2022-01-05 14:51:05.187922: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
usage: programm_name [-h] [--list_models [LIST_MODELS]] [--text TEXT]
           [--model_name MODEL_NAME] [--vocoder_name VOCODER_NAME]
           [--config_path CONFIG_PATH] [--model_path MODEL_PATH]
           [--out_path OUT_PATH] [--use_cuda USE_CUDA]
           [--vocoder_path VOCODER_PATH]
           [--vocoder_config_path VOCODER_CONFIG_PATH]
           [--speakers_json SPEAKERS_JSON] [--speaker_idx SPEAKER_IDX]
           [--gst_style GST_STYLE] [--save_spectogram SAVE_SPECTOGRAM]
programm_name: error: unrecognized arguments: tts_models/en/ljspeech/tacotron2-DCA
2

CodePudding user response:

As pointed out elsewhere the basic problem is that QProcess goes to some trouble to avoid going through any shell. Having said that you should be able to achieve what you want by invoking a shell explicitly.

Let's say the command you would usually run under bash is ls -l | grep '\.' ...

QProcess process;
QString shell_command = "ls -l | grep '\.'";
process.start("bash", { "-c", shell_command });

Now you can read the command's standard output/error streams as you would with any other QProcess.

[Note that this is more or less the Qt version of a previous post.]

  •  Tags:  
  • Related