Как сломать цикл 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?
Ответ #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 ошибкой в отдельности.
-
4
-
6
-
8
-
3
-
8
-
3
-
2
-
10
-
6
-
3
-
18
-
7
-
7
-
5
-
2
-
7
-
4
-
10
-
5
-
4
-
2
-
5
-
2
-
3
-
5
-
8
-
3
-
3
-
1
-
4
-
3
-
1
-
4
-
5
-
5
-
5
-
3
-
2
-
3
-
2
-
7
-
6
-
4
-
2
-
11
-
1
-
7
-
10
-
6
-
4