Detecting sys.exit() and ValueError from a python script in bash script

huangapple go评论124阅读模式
英文:

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上寻找解决方案后,我尝试了在某些条件中使用以下内容:

  1. if [ $? -ne 0 ];
  2. then
  3. echo "exit 1"
  4. fi
  5. echo "EXIT 0"

我继续得到EXIT 0,表明没有检测到错误。我在这里有什么不明白的地方?

为了澄清,我的目标是检测由调用的Python脚本抛出的任何错误,并相应地让bash脚本作出响应。

这是bash脚本的大致示意:

  1. Iter=1
  2. while [ $nr_lines -lt 17 ]; do
  3. if [ $Iter -eq 5 ]; then
  4. echo ''
  5. echo 'Relax parameter. Iteration:' $Iter
  6. relax -i $Iter -o ./dir
  7. nr_lines=$(wc -l < ./dir/output$Iter.csv)
  8. let Iter++
  9. else
  10. echo ''
  11. echo 'Iteration:' $Iter
  12. iter -i $Iter -o ./dir
  13. nr_lines=$(wc -l < ./dir/output$Iter.csv)
  14. let Iter++
  15. fi
  16. done

我尝试将错误捕获条件放在这里:

  1. Iter=1
  2. while [ $nr_lines -lt 17 ]; do
  3. if [ $Iter -eq 5 ]; then
  4. echo ''
  5. echo 'Relax parameter. Iteration:' $Iter
  6. relax -i $Iter -o ./dir
  7. nr_lines=$(wc -l < ./dir/output$Iter.csv)
  8. let Iter++
  9. else
  10. echo ''
  11. echo 'Iteration:' $Iter
  12. iter -i $Iter -o ./dir
  13. nr_lines=$(wc -l < ./dir/output$Iter.csv)
  14. let Iter++
  15. fi
  16. if [ $? -ne 0 ];
  17. then
  18. echo "exit 1"
  19. fi
  20. echo "EXIT 0"
  21. done

以及在这里:

  1. Iter=1
  2. while [ $nr_lines -lt 17 ]; do
  3. if [ $Iter -eq 5 ]; then
  4. echo ''
  5. echo 'Relax parameter. Iteration:' $Iter
  6. relax -i $Iter -o ./dir
  7. nr_lines=$(wc -l < ./dir/output$Iter.csv)
  8. let Iter++
  9. else
  10. echo ''
  11. echo 'Iteration:' $Iter
  12. iter -i $Iter -o ./dir
  13. nr_lines=$(wc -l < ./dir/output$Iter.csv)
  14. let Iter++
  15. fi
  16. done
  17. if [ $? -ne 0 ];
  18. then
  19. echo "exit 1"
  20. fi
  21. 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(&#39;Program&#39;, &#39;console_scripts&#39;, &#39;iter&#39;)()) 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:

  1. if [ $? -ne 0 ];
  2. then
  3. echo &quot;exit 1&quot;
  4. fi
  5. echo &quot;EXIT 0&quot;

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:

  1. Iter=1
  2. while [ $nr_lines -lt 17 ]; do
  3. if [ $Iter -eq 5 ]; then
  4. echo &#39;&#39;
  5. echo &#39;Relax parameter. Iteration:&#39; $Iter
  6. relax -i $Iter -o ./dir
  7. nr_lines=$(wc -l &lt; ./dir/output$Iter.csv)
  8. let Iter++
  9. else
  10. echo &#39;&#39;
  11. echo &#39;Iteration:&#39; $Iter
  12. iter -i $Iter -o ./dir
  13. nr_lines=$(wc -l &lt; ./dir/output$Iter.csv)
  14. let Iter++
  15. fi
  16. done

I have tried putting the conditional for error capturing here:

  1. Iter=1
  2. while [ $nr_lines -lt 17 ]; do
  3. if [ $Iter -eq 5 ]; then
  4. echo &#39;&#39;
  5. echo &#39;Relax parameter. Iteration:&#39; $Iter
  6. relax -i $Iter -o ./dir
  7. nr_lines=$(wc -l &lt; ./dir/output$Iter.csv)
  8. let Iter++
  9. else
  10. echo &#39;&#39;
  11. echo &#39;Iteration:&#39; $Iter
  12. iter -i $Iter -o ./dir
  13. nr_lines=$(wc -l &lt; ./dir/output$Iter.csv)
  14. let Iter++
  15. fi
  16. if [ $? -ne 0 ];
  17. then
  18. echo &quot;exit 1&quot;
  19. fi
  20. echo &quot;EXIT 0&quot;
  21. done

and here:

  1. Iter=1
  2. while [ $nr_lines -lt 17 ]; do
  3. if [ $Iter -eq 5 ]; then
  4. echo &#39;&#39;
  5. echo &#39;Relax parameter. Iteration:&#39; $Iter
  6. relax -i $Iter -o ./dir
  7. nr_lines=$(wc -l &lt; ./dir/output$Iter.csv)
  8. let Iter++
  9. else
  10. echo &#39;&#39;
  11. echo &#39;Iteration:&#39; $Iter
  12. iter -i $Iter -o ./dir
  13. nr_lines=$(wc -l &lt; ./dir/output$Iter.csv)
  14. let Iter++
  15. fi
  16. done
  17. if [ $? -ne 0 ];
  18. then
  19. echo &quot;exit 1&quot;
  20. fi
  21. echo &quot;EXIT 0&quot;

and both return EXIT 0, suggesting no errors have occurred.

答案1

得分: 1

将以下部分进行翻译:

  1. iter -i $Iter -o ./dir

改为

  1. if ! iter -i $Iter -o ./dir
  2. then
  3. echo "iter 失败"
  4. break
  5. fi

这直接测试了由 iter 运行的 Python 脚本的退出状态。如果它以非零状态退出,您将打印该消息并跳出 while 循环。

您可以类似地处理 relax

英文:

Change

  1. iter -i $Iter -o ./dir

to

  1. if ! iter -i $Iter -o ./dir
  2. then
  3. echo &quot;iter failed&quot;
  4. break
  5. 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.

huangapple
  • 本文由 发表于 2023年7月7日 02:24:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/76631586.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定