Как сломать цикл bash for изнутри скрипта python?

У меня есть цикл for, который итеративно 9X_python-shell запускает скрипт Python. Внутри скрипта 9X_bash Python есть условие, выполнение которого 9X_py делает ненужным выполнение скрипта Python 9X_python-interpreter или даже цикла for. Например:

#Bash Script
for i in {1..15}; do
    echo "Pre Outside ${i}"
    python minimal_test.py $i
    echo "Post Outside ${i}"
done

#Python script
import sys
import subprocess
k = int(sys.argv[1])
end_bash = False

if k == 7:
    end_bash = True
print("Inside " + str(k))
if end_bash:
    bashCommand = "break"
    process = subprocess.Popen(bashCommand, stdout=subprocess.PIPE)

Когда цикл 9X_python-interpreter i в сценарии bash == 6, а затем 7, программа 9X_bash-variables должна вывести:

PreOutside 6
PreInside 6
PostOutside 6    
Pre Outside 7
Pre Inside 7 #The program must end here

Однако я получаю следующую 9X_python-interpreter ошибку, и программа продолжает работать

File "/software/software/Python/3.9.5-GCCcore-10.3.0/lib/python3.9/subprocess.py", line 1821, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'break'

Есть ли способ заставить 9X_python-interpreter bash завершить цикл for из скрипта python?

4
0
1
Общее количество ответов: 1

Ответ #1

Ответ на вопрос: Как сломать цикл bash for изнутри скрипта python?

Сделайте так, чтобы ваш скрипт Python завершал 9X_bashrc работу с ошибкой. Затем сценарий оболочки 9X_bash-function становится

for i in {1..15}; do
    python minimal_test.py "$i" || break
done

Другими словами, ваш скрипт Python 9X_bashrc должен sys.exit(1) сигнализировать об ошибке оболочке 9X_bash-script (или любой вызывающей утилите). Точное число 9X_bash-alias зависит от вас; любое ненулевое число является 9X_bashrc кодом отказа. (Диапазон 0–255, т. е. char без 9X_pythonic знака.)

Запуск break в подпроцессе не имеет смысла; вы 9X_.bashrc запускали новый экземпляр Bash, который 9X_.bash-profile не зависит от того, который запускает цикл, тот, в 9X_pythonista котором, конечно, break не делает ничего полезного 9X_bashrc и фактически является просто синтаксической 9X_bashrc ошибкой в ​​отдельности.

13
0