Как сломать цикл bash for изнутри скрипта python?
У меня есть цикл for, который итеративно 9X_bash-variables запускает скрипт Python. Внутри скрипта 9X_bash-script Python есть условие, выполнение которого 9X_.bashrc делает ненужным выполнение скрипта Python 9X_python-shell или даже цикла 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_bash 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_pythonista ошибку, и программа продолжает работать
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_bash-variables bash завершить цикл for из скрипта python?
Ответ #1
Ответ на вопрос: Как сломать цикл bash for изнутри скрипта python?
Сделайте так, чтобы ваш скрипт Python завершал 9X_bash-variables работу с ошибкой. Затем сценарий оболочки 9X_bash-script становится
for i in {1..15}; do python minimal_test.py "$i" || break done
Другими словами, ваш скрипт Python 9X_python должен sys.exit(1)
сигнализировать об ошибке оболочке 9X_bash (или любой вызывающей утилите). Точное число 9X_pythonic зависит от вас; любое ненулевое число является 9X_bash-function кодом отказа. (Диапазон 0–255, т. е. char
без 9X_.bashrc знака.)
Запуск break
в подпроцессе не имеет смысла; вы 9X_.bash-profile запускали новый экземпляр Bash, который 9X_pythonic не зависит от того, который запускает цикл, тот, в 9X_python котором, конечно, break
не делает ничего полезного 9X_python-shell и фактически является просто синтаксической 9X_bash-function ошибкой в отдельности.
-
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