unix 从bash脚本中的python脚本中检测sys.exit()和ValueError

gblwokeq  于 2023-08-04  发布在  Unix
关注(0)|答案(1)|浏览(155)

我创建了一个bash脚本,它根据特定条件管理多个相关的Python脚本(即,当文件行数< x时运行此脚本,如果...则运行不同的脚本,等等)。我使用入口点在bash脚本中执行这些python脚本。
在验证bash脚本时,我发现了一些边缘情况,其中所有条件都失败,导致sys.exit(load_entry_point('Program', 'console_scripts', 'iter')())ValueError: Nothing was generated(在python程序中指定,如果没有发生任何情况,将引发)。
在看了SO之后,我在一些条件句中尝试了这样的东西:

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,表明没有发生错误。

jdgnovmf

jdgnovmf1#

变更

iter -i $Iter -o ./dir

字符串

if ! iter -i $Iter -o ./dir
        then
            echo "iter failed"
            break
        fi


这直接测试iter运行的python脚本的退出状态。如果它以非零状态退出,则打印消息并跳出while循环。
您可以对relax执行类似的操作。

相关问题