Bash while循环调用Python脚本

Bash while循环调用Python脚本,python,bash,while-loop,Python,Bash,While Loop,我想在Bash while循环中调用Python脚本。但是,我不太了解如何恰当地使用Bash的while循环(可能还有变量)语法。我正在寻找的行为是,当文件仍然包含行(DNA序列)时,我调用Python脚本来提取序列组,以便另一个程序(dialign2)可以对齐它们。最后,我将路线添加到结果文件中。注意:我并没有试图迭代该文件。为了使Bash-while循环工作,我应该更改什么?我还想确保while循环将重新检查每个循环上不断变化的file.txt文件。以下是我的尝试: #!/bin/bash

我想在Bash while循环中调用Python脚本。但是,我不太了解如何恰当地使用Bash的while循环(可能还有变量)语法。我正在寻找的行为是,当文件仍然包含行(DNA序列)时,我调用Python脚本来提取序列组,以便另一个程序(dialign2)可以对齐它们。最后,我将路线添加到结果文件中。注意:我并没有试图迭代该文件。为了使Bash-while循环工作,我应该更改什么?我还想确保while循环将重新检查每个循环上不断变化的file.txt文件。以下是我的尝试:

#!/bin/bash
# Call a python script as many times as needed to treat a text file

c=1
while [ `wc -l file.txt` > 0 ] ; # Stop when file.txt has no more lines
do
    echo "Python script called $c times"
    python script.py # Uses file.txt and removes lines from it
    # The Python script also returns a temp.txt file containing DNA sequences
    c=$c + 1
    dialign -f temp.txt # aligns DNA sequences
    cat temp.fa >>results.txt # append DNA alignements to result file
done

谢谢

尝试
-gt
删除shell元字符
>

while [ `wc -l  file.txt`  -gt 0 ]
do
    ...
    c=$[c + 1]
done

不知道你为什么要这么做

c=1
while [[ -s file.txt ]] ; # Stop when file.txt has no more lines
do
    echo "Python script called $c times"
    python script.py # Uses file.txt and removes lines from it
    c=$(($c + 1))
done

以下内容应满足您的要求:

#!/bin/bash

c=1
while read line; 
do
    echo "Python script called $c times"
    # $line contains a line of text from file.txt
    python script.py 
    c=$((c + 1))
done < file.txt

@OP如果您想循环文件,只需使用whileread循环即可。此外,您没有使用变量$c以及行。是否将每一行都传递给Python脚本?或者只要遇到一行代码就调用Python脚本?(如果你这样做,你的脚本会变慢)



您可能需要更清楚地了解目前不起作用的内容…
wc-l file.txt
将返回类似于
100 file.txt
,如果您确实想使用wc,则需要提取数字。例如,
wc-l file.txt | cut-f1-d''
为什么不从Python脚本调用Python?原因是我需要使用另外两个程序,dialign2(对齐DNA序列)和cat(将对齐结果附加到结果文件)。我不习惯用Python和bash来称呼这些,因为它们似乎是一个自然的选择。另外,我正在学习一些bash编程,我想把它们放在一个小脚本的上下文中。你的代码(非常奇怪,顺便说一句)给我们提供了一些关于你实际想做什么的信息。您可以粘贴一个数据示例(输入和输出)。
-s file
如果该文件存在且大小大于零,则为True。您只需注意python脚本不会留下任何尾随换行符或其他内容。关于此问题,有很多问题会提醒您注意。我很难想象为什么一个没有参数的python脚本需要被bash多次调用。谢谢,这对我来说完全是个窍门。我想这样做的原因(如果你看到更好的方法,建议另一种方法)是使用程序“dialign2”递归地对齐DNA序列,同时选择每次与Python脚本对齐的序列,并从输入文本文件(fasta格式)中删除这些序列以进行另一次传递。选择要对齐的序列是基于名称的一部分,我觉得在Python中这样做很舒服。再次感谢!我在代码中添加了详细信息,以进一步说明我正在尝试做什么。不需要cat with while loopHi,我不只是尝试迭代一个文件的行,而是在每个过程中创建另一个临时文件供另一个程序使用,直到原始文件为空。我补充了问题的细节。Cheers@ghostdog74:是的。但如果您在读取xwhile(())中使用
进行这样的整数比较:
while($(wc-l0))
(我从ghostdog74学到了使用
wc
进行重定向,它消除了文件名并只返回计数。)你不需要扫描整个文件来知道它是否是空的
-s
当然会工作,因为(只是为了好玩)
grep-lv'^*$'file.txt>/dev/null
会检测(并在之后停止)第一个非空行——对于一个有一个或多个非空行的文件,状态为1,对于所有其他情况(包括空/零字节文件),状态为0,谢谢,但我不尝试循环浏览文件。我在原来的问题上增加了细节。是的。您正在file.txt上使用wc-l和while循环,这意味着您正在迭代一个文件。唯一的区别是您是否要使用迭代的line变量。我只是尝试使用文件的一个特征(即文件中仍然包含信息)作为继续在其上使用Python脚本的标准。我猜“wc”函数正在迭代文件。这就是你的意思吗?是的,这就是我的意思。因为您正在检查行数
myfile = open('file.txt', 'r')

for count, line in enumerate(myfile):
    print '%i lines in file' % (count + 1,)
    # the variable "line" contains the line of text from the file.txt 

    # Do your thing here.
while true
do
    while read -r line
    do
       # if you are taking STDIN in myscript.py, then something must be passed to
       # myscript.py, if not i really don't understand what you are doing.

       echo "$line" | python myscript.py > temp.txt
       dialign -f temp.txt # aligns DNA sequences
       cat temp.txt >>results.txt
    done <"file.txt"
    if [ ! -s "file.txt" ]; break ;fi
done  
f=open("file.txt"):
for line in f:
    print "do something with line"
    print "or bring what you have in myscript.py here"
f.close()