stupidstudent
stupidstudent

Reputation: 698

QT plain command execution like system

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

Upvotes: 0

Views: 116

Answers (1)

G.M.
G.M.

Reputation: 12879

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.]

Upvotes: 1

Related Questions