I am having a shell script which opens a file and pass it to python script for processing it. So if there is any issue with the file ( e.g. the file content is not in the format required for the successful execution for python script), the python script throws an exception. Since my objective it to process N files using python script. I need to know which is the file causing the script to break. I read on how to catch the exception in thrown by command execution. http://linuxcommand.org/wss0150.php . But in my case its the python script which throws the exception and I need to know in shell script what the exception has been thrown. Can anyone help me how can I proceed with this?
Below is the code snippet :
#!/bin/bash
yesterday=$(date --date "yesterday" "+%y%m%d")
ftoday=$(date --date "today" "+%m-%d-%Y")
year=$(date "+%Y")
fileList=$(find C:/logdata/$year/$ftoday/ -iname "*"$yesterday".log")
for var in $fileList
do
echo -e "\n START Processing File : $var" >> shelltestlog.txt
cat $var| ./scriptA.py
echo -e "\n END Processing File : $var" >> shelltestlog.txt
done
Catching Exceptions in Python In Python, exceptions can be handled using a try statement. The critical operation which can raise an exception is placed inside the try clause. The code that handles the exceptions is written in the except clause.
If you need to execute a shell command with Python, there are two ways. You can either use the subprocess module or the RunShellCommand() function. The first option is easier to run one line of code and then exit, but it isn't as flexible when using arguments or producing text output.
There is no try/catch in bash; however, one can achieve similar behavior using && or || . it stops your script if any simple command fails.
If your python script returns an non-zero error level whenever it gets an exception, you can use || { }
to log messages:
./scriptA.py < "$file" || {
printf "\n Python script scriptA.py failed with file \"%s\".\n" "$file" >> shelltestlog.txt
}
I actually tried to simplify your code first:
#!/bin/bash
yesterday=$(date --date "yesterday" "+%y%m%d")
ftoday=$(date --date "today" "+%m-%d-%Y")
year=$(date "+%Y")
readarray -t filesList < <(find C:/logdata/$year/$ftoday/ -iname "*"$yesterday".log")
for file in "${filesList[@]}"; do
printf "\n START Processing File : %s\n" "$file" >> shelltestlog.txt
./scriptA.py < "$file" || {
printf "\n Python script scriptA.py failed with file \"%s\".\n" "$file" >> shelltestlog.txt
}
printf "\n END Processing File : %s\n" "$file" >> shelltestlog.txt
done
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With