在bash脚本中插入python代码

时间:2017-01-03 10:47:33

标签: python bash variables

我有以下bash脚本:

#!/bin/bash
while read line
do
    ORD=`echo $line | cut -c 7-21`
    if [[ -r ../FASTA_SEC/${ORD}.fa ]]
    then
            WCR=`fgrep -o N ../FASTA_SEC/$ORD.fa | wc -l`
            WCT=`wc -m < ../FASTA_SEC/$ORD.fa`
            PER1=`echo print $WCR/$WCT.*100 | python`
            WCTRIN=`fgrep -o N ../FASTA_SEC_EDITED/$ORD"_Trimmed.fa" | wc -l`
            WCTRI=`wc -m < ../FASTA_SEC_EDITED/$ORD"_Trimmed.fa"`
            PER2=`echo print $WCTRIN/$WCTRI.*100 | python`
            PER3=`echo print $PER1-$PER2 | python`
            echo $ORD $PER1 $PER2 $PER3 >> Log.txt
        if [ $PER2 -ge 30 -a $PER3 -lt 10 ]
        then
            mv ../FASTA_SEC/$ORD.fa ./TRASH/$ORD.fa
            mv ../FASTA_SEC_EDITED/$ORD"_Trimmed.fa" ./TRASH/$ORD"_Trimmed.fa"
        fi
    fi
done < ../READ/Data.txt

$ PER变量是浮点数,因为你可能已经注意到了,所以我不能在嵌套的if条件下使用它们。我想在python中进行这种条件迭代,但是我不知道它是如何在bash脚本中执行的,我也不知道如何将变量$ PER2和$ PER3的值导入到python中。我可以在同一个bash脚本中直接编写python代码,以某种方式调用python吗?

感谢您的帮助,第一次面对此问题。

3 个答案:

答案 0 :(得分:1)

您可以使用python -c CMD从命令行执行一段python代码。如果你想让bash插入你的环境变量,你应该在CMD周围使用双引号。

您可以通过调用sys.exit返回一个值,但请记住,Python中的true和false在bash中具有相反的含义。

所以你的代码是:

if python -c "import sys; sys.exit(not($PER2 > 30 and $PER3 < 10 ))"

答案 1 :(得分:0)

也许这会有帮助吗?

$ X=4; Y=7; Z=$(python -c "print($X * $Y)")
$ echo $Z
28

python -c "str""str"作为输入并运行它。

但是为什么不在python中重写所有内容?使用subprocess可以很好地执行bash命令,它包含在python中或(需要安装)sh

答案 2 :(得分:0)

可以借助here document语法将Python代码提供给python可执行文件的标准输入:

variable=$(date)
python2.7 <<SCRIPT
print "The current date: %s" % "${variable}"
SCRIPT

为了避免参数替换(块内的解释),引用第一个限制字符串:<<'SCRIPT'

如果要将输出分配给变量,请使用command substitution

output=$(python2.7 <<SCRIPT
print "The current date: %s" % "${variable}"
SCRIPT
)

请注意,建议不要使用后引号进行命令替换,因为无法嵌套它们,并且$(...)形式更具可读性。