From d1c32d32c6bfb989ffdca25c75c34320826787d6 Mon Sep 17 00:00:00 2001 From: olli Date: Wed, 27 Mar 2024 22:49:30 +0100 Subject: [PATCH] fix broken pipe --- gaboshlib/g_python.sh | 65 ++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/gaboshlib/g_python.sh b/gaboshlib/g_python.sh index 8cb099c..6e200fb 100644 --- a/gaboshlib/g_python.sh +++ b/gaboshlib/g_python.sh @@ -1,6 +1,5 @@ function g_python { - unset g_python_result g_rnd=$$ local g_python_jobs @@ -8,56 +7,58 @@ function g_python { # Use python in backround for multiple python commands running much faster #if [ -z "${g_python_running}" ] - if ! [[ ${g_python_jobs[*]} =~ python-pipeexec.py ]] + if [[ ${g_python_jobs[*]} != *python-pipeexec.py* ]] then mkdir -p ${g_tmp}/${g_rnd} if [ -s ${g_tmp}/${g_rnd}/python-error ] then g_echo_error "From last python run: $(cat ${g_tmp}/${g_rnd}/python-error)" - rm -f ${g_tmp}/${g_rnd}/python-error fi [ -p ${g_tmp}/${g_rnd}/python-in ] || mkfifo ${g_tmp}/${g_rnd}/python-in - [ -p ${g_tmp}/${g_rnd}/python-out ] || mkfifo ${g_tmp}/${g_rnd}/python-out + #[ -p ${g_tmp}/${g_rnd}/python-out ] || mkfifo ${g_tmp}/${g_rnd}/python-out echo "while 1: exec(open(\"${g_tmp}/${g_rnd}/python-in\").read()) + print('DONE') " >${g_tmp}/${g_rnd}/python-pipeexec.py # python stream channel - { python3 -u ${g_tmp}/${g_rnd}/python-pipeexec.py >${g_tmp}/${g_rnd}/python-out 2>${g_tmp}/${g_rnd}/python-error & } + { python3 -u ${g_tmp}/${g_rnd}/python-pipeexec.py >>${g_tmp}/${g_rnd}/python-out 2>>${g_tmp}/${g_rnd}/python-error & } g_python_running="true" fi # do python - echo "$@" >${g_tmp}/${g_rnd}/python-in & - sleep 0.02 + >${g_tmp}/${g_rnd}/python-out + >${g_tmp}/${g_rnd}/python-error + echo $@ >${g_tmp}/${g_rnd}/python-in - mapfile -t g_python_jobs < <(jobs -r) - if ! [[ ${g_python_jobs[*]} =~ python-pipeexec.py ]] - then - g_echo_error "$(cat ${g_tmp}/${g_rnd}/python-error)" - rm ${g_tmp}/${g_rnd}/python-error - unset g_python_running - return 1 - fi + while true + do + + # Check for output + if [ -s ${g_tmp}/${g_rnd}/python-out ] + then + unset g_python_result + mapfile -t g_python_result <${g_tmp}/${g_rnd}/python-out + if [[ ${g_python_result[-1]} == DONE ]] + then + # remove the DONE output (last array element + unset g_python_result[-1] + break + fi + fi - if [ -n "$g_python_waitforoutput" ] - then - until [ -n "$g_python_result" ] - do - read -t 0.2 g_python_result <${g_tmp}/${g_rnd}/python-out - [ -s "${g_tmp}/${g_rnd}/python-error" ] && break - done - unset g_python_waitforoutput - else - read -t0.2 g_python_result <${g_tmp}/${g_rnd}/python-out - fi + # Check for error + mapfile -t g_python_jobs < <(jobs -r) + if [ -s "${g_tmp}/${g_rnd}/python-error" ] || [[ ${g_python_jobs[*]} != *python-pipeexec.py* ]] + then + g_echo_error "Python Progress not running: +$(cat ${g_tmp}/${g_rnd}/python-error)" + return 1 + fi - if [ -s "${g_tmp}/${g_rnd}/python-error" ] - then - g_echo_error "$(cat ${g_tmp}/${g_rnd}/python-error)" - rm ${g_tmp}/${g_rnd}/python-error - return 1 - fi + # sleep a short time + sleep 0.1 + done }