英文:
Detecting sys.exit() and ValueError from a python script in bash script
问题
我创建了一个bash脚本,根据特定条件(即,如果文件有小于x行,则运行此脚本,如果...,等等)管理多个相关的Python脚本。我在bash脚本中使用入口点来执行这些Python脚本。
在验证bash脚本时,我发现一些边缘情况,其中所有条件都失败,导致sys.exit(load_entry_point('Program', 'console_scripts', 'iter')())
和ValueError: Nothing was generated
(在Python程序中指定,如果什么都不发生,就会引发此错误)。
在Stack Overflow上寻找解决方案后,我尝试了在某些条件中使用以下内容:
if [ $? -ne 0 ];
then
echo "exit 1"
fi
echo "EXIT 0"
我继续得到EXIT 0
,表明没有检测到错误。我在这里有什么不明白的地方?
为了澄清,我的目标是检测由调用的Python脚本抛出的任何错误,并相应地让bash脚本作出响应。
这是bash脚本的大致示意:
Iter=1
while [ $nr_lines -lt 17 ]; do
if [ $Iter -eq 5 ]; then
echo ''
echo 'Relax parameter. Iteration:' $Iter
relax -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
else
echo ''
echo 'Iteration:' $Iter
iter -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
fi
done
我尝试将错误捕获条件放在这里:
Iter=1
while [ $nr_lines -lt 17 ]; do
if [ $Iter -eq 5 ]; then
echo ''
echo 'Relax parameter. Iteration:' $Iter
relax -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
else
echo ''
echo 'Iteration:' $Iter
iter -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
fi
if [ $? -ne 0 ];
then
echo "exit 1"
fi
echo "EXIT 0"
done
以及在这里:
Iter=1
while [ $nr_lines -lt 17 ]; do
if [ $Iter -eq 5 ]; then
echo ''
echo 'Relax parameter. Iteration:' $Iter
relax -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
else
echo ''
echo 'Iteration:' $Iter
iter -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
fi
done
if [ $? -ne 0 ];
then
echo "exit 1"
fi
echo "EXIT 0"
两者都返回EXIT 0
,表明没有发生错误。
英文:
I created a bash script that manages multiple related python scripts based on specific conditions (i.e., run this script while file has < x number of lines, run a different script if..., etc.). I am using entry points to execute these python scripts within the bash script.
When validating the bash script I found some edge cases where all the conditions fail, resulting in a sys.exit(load_entry_point('Program', 'console_scripts', 'iter')())
and ValueError: Nothing was generated
(designated within the python program to be raised if nothing happens).
After looking on SO, I tried something like this within some of my conditionals:
if [ $? -ne 0 ];
then
echo "exit 1"
fi
echo "EXIT 0"
I continue to get EXIT 0
, suggesting no errors are being detected. What I am not understanding here?
For clarity, my goal is to detect any errors thrown by the invoked python scripts to have the bash script respond accordingly.
Here is an idea of what the bash script is like:
Iter=1
while [ $nr_lines -lt 17 ]; do
if [ $Iter -eq 5 ]; then
echo ''
echo 'Relax parameter. Iteration:' $Iter
relax -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
else
echo ''
echo 'Iteration:' $Iter
iter -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
fi
done
I have tried putting the conditional for error capturing here:
Iter=1
while [ $nr_lines -lt 17 ]; do
if [ $Iter -eq 5 ]; then
echo ''
echo 'Relax parameter. Iteration:' $Iter
relax -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
else
echo ''
echo 'Iteration:' $Iter
iter -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
fi
if [ $? -ne 0 ];
then
echo "exit 1"
fi
echo "EXIT 0"
done
and here:
Iter=1
while [ $nr_lines -lt 17 ]; do
if [ $Iter -eq 5 ]; then
echo ''
echo 'Relax parameter. Iteration:' $Iter
relax -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
else
echo ''
echo 'Iteration:' $Iter
iter -i $Iter -o ./dir
nr_lines=$(wc -l < ./dir/output$Iter.csv)
let Iter++
fi
done
if [ $? -ne 0 ];
then
echo "exit 1"
fi
echo "EXIT 0"
and both return EXIT 0
, suggesting no errors have occurred.
答案1
得分: 1
将以下部分进行翻译:
将
iter -i $Iter -o ./dir
改为
if ! iter -i $Iter -o ./dir
then
echo "iter 失败"
break
fi
这直接测试了由 iter
运行的 Python 脚本的退出状态。如果它以非零状态退出,您将打印该消息并跳出 while
循环。
您可以类似地处理 relax
。
英文:
Change
iter -i $Iter -o ./dir
to
if ! iter -i $Iter -o ./dir
then
echo "iter failed"
break
fi
This directly tests the exit status of the python script run by iter
. If it exits with a non-zero status, you print the message and break out of the while
loop.
You can do similarly with relax
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论