- How to check the status of bash shell script while executing from Python script?
- Работа с кодами выхода между скриптами Python и Shell
- Коды выхода между скриптами Python и Shell
- [Случай: 1] Стандартные коды выхода
- [Случай: 2] Пользовательские коды выхода
- [Случай: 3a] Python Исключения и коды выхода (с правильной обработкой исключений в Python)
- [Случай: 3b] Python Исключения и коды выхода (вызывает исключение в Python)
- Вывод
How to check the status of bash shell script while executing from Python script?
I have a simple Python script which will execute a shell script using subprocess module in Python. Below is my Python shell script which is calling testing.sh shell script and it works fine.
import os import json import subprocess jsonData = '' jj = json.loads(jsonData) os.putenv( 'jj3', ' '.join( str(v) for v in jj['pp'] ) ) print "start" proc = subprocess.Popen('testing.sh', stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = proc.communicate() if stderr: print "Shell script gave some error" print stderr else: print stdout print "end" # Shell script ran fine.
#!/bin/bash dir1=some_directory dir2=some_directory length1=some_number length2=some_number if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ] then for el in $jj3 do scp david@machineB:/data/be_t1_snapshot/20131215/t1_"$el"_5.data /data01/primary/. || scp david@machineC:/data/be_t1_snapshot/20131215/t1_"$el"_5.data /data01/primary/. done fi
What my above shell script does is, it will copy the files from machineB OR machineC to machineA . If the files are not there in machineB then it should be there in machineC always. So it will try to copy the files from machineB to machineA but if the files are not there in machineB then it will try to copy the files from machineC to machineA . Now my above Python script (which I am running from machineA ) tries to execute my above shell script and see whether my script got executed successfully or not. As I am storing the stderr of my shell script and stdout as well. Problem Statement:- With the above approach there is one problem that I am seeing. As I mentioned if the files are not there in machineB , then it will try to copy the files from machineC to machineA . So whenever I run my Python script which calls my shell script, what happens is that, some files are not there in machineB so it throws some exception and then it tries copying the files from machineC but when the call comes back to Python script, it always go inside if stderr: block as there was an error while copying the files from machineB (which is not what I want) and end print statement doesn’t gets printed out. So the question is if the files are not there in machineB , it will try copying the files from machineC and if the file is there is machineC and got successfully copied to machineA without any error, then I want to call that as a success instead of failure . In current scenario what is happening, if the files are not there in machineB and got successfully copied from machineC then it still counts as a failure and end print statement doesn’t gets printed out. I also want to see whether my shell script has any problem while executing from Python. If yes, then I don’t want to print end statement. How should I overcome this problem? UPDATE:- What will happen with the below shell script? As the first for loop will failed because david is not a linux command, but my scp command works fine. So still I will see status code as not equal to 0?
for i in $( david ); do echo item: $i done dir1=some_directory dir2=some_directory length1=some_number length2=some_number if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ] then for el in $jj3 do scp david@machineB:/data/be_t1_snapshot/20131215/t1_"$el"_5.data /data01/primary/. || scp david@machineC:/data/be_t1_snapshot/20131215/t1_"$el"_5.data /data01/primary/. done fi
Работа с кодами выхода между скриптами Python и Shell
Код выхода получается при выполнении команды или сценария. Код выхода — это ответ системы, сообщающий об успешном выполнении, сбое или любом другом условии, который дает представление о том, что вызвало (неожиданный) результат выполнения команды / сценария.
- Коды выхода не обнаруживаются, пока кто-то об этом не попросит.
- Коды выхода полезны для отладки кода.
- Коды выхода полезны при различных системных интеграциях
Синонимы: статус выхода, код возврата, код статуса выхода.
Коды выхода между скриптами Python и Shell
Часто мы имеем дело с системами, которые включают несколько разных языков программирования, где одна программа (дочерняя) вызывается изнутри другой (родительской). В зависимости от статуса (выхода) дочернего элемента выполняется остальная часть потока родительской программы. В этом случае обработка кодов выхода имеет первостепенное значение.
В этой статье мы рассмотрим способы работы с кодами выхода между сценариями python и оболочкой. Итак, приступим прямо к делу 🙂
An exit code in shell script is captured by executing $?
[Случай: 1] Стандартные коды выхода
Рассмотрим следующий Python ( StandardExitCode.py ) и сценарий оболочки ( StandardExitCode.sh ):
При выполнении сценария оболочки (который вызывает код Python) мы получаем стандартный код выхода, как показано ниже:
[Случай: 2] Пользовательские коды выхода
Рассмотрим следующий Python ( CustomExitCode.py ) и сценарий оболочки ( CustomExitCode.sh ):
Выполнение CustomExitCode.sh приведет к захвату пользовательского кода 9 из программы Python.
Примечание. Если вы передадите в вызов sys.exit() любое другое число, переданное значение будет напечатано, а статус выхода из системы будет 1 . См. Пример ниже:
[Случай: 3a] Python Исключения и коды выхода (с правильной обработкой исключений в Python)
Рассмотрим следующий Python ( Exceptions.py ) и сценарий оболочки ( Exceptions.sh ):
Поскольку исключение обрабатывается правильно в коде Python, оно завершится с успешным кодом возврата 0 при выполнении Exceptions.sh .
[Случай: 3b] Python Исключения и коды выхода (вызывает исключение в Python)
Выполнение кода оболочки теперь приведет к печати исключения на терминале, а код выхода будет ошибочным, т.е. 1
Вывод
В этой статье мы рассмотрели несколько очень простых случаев обработки кодов выхода между Python и Shell Scrips. Суть вопроса:
- Стандартные коды выхода получаются при выполнении программы Python. Успешное выполнение возвращает 0 , а неудачное выполнение возвращает 1
- Пользовательские коды выхода могут быть переданы с помощью вызова sys.exit() в python. Полезно при добавлении описаний ошибок к кодам выхода. Все аргументы вызова, кроме Integer, печатаются, и система завершает работу с кодом ошибки 1 .
- При правильной обработке исключений в коде Python применяются стандартные правила кода выхода.
- Когда в python возникают исключения, передается код выхода 1 , и исключение печатается на терминале.
Пожалуйста, дайте мне знать, стоит ли это читать. Делитесь своими отзывами и предложениями в комментариях. Удачного программирования .