
ClustalW是一个流行的多序列比对命令行工具(还有一个图形界面的版本 ,叫 ClustalX)。Biopython的Bio.Align.Applications 模块中有一个为这个比对工具(和其它工具)而写的包装器。
在尝试着从 Python 中使用 ClustalW 之前,你应当先在命令行中手动试着运行一下ClustalW 工具,熟悉一下其它的选项。你将会发现Biopython 的包装器与实际的命令行API 是非常一 致的:
>>> from Bio.Align.Applications import ClustalwCommandline
>>> help(ClustalwCommandline)
...
对于最基本的使用来说,你所需要的就是一个FASTA 输入文件 ,例如 opuntia.fasta (可以在网上找到 ,或者在 Biopython 源代码的 Doc/examples 子目录中找到 )。这是一个小的FASTA 文件 ,其中包含咯 7个仙人掌DNA 序列(来自仙人 掌科 Opuntia )。
默认情况下,ClustalW会生成一个比对文件和一个导向树文件,它们的名字是按照输入FASTA 文件来起的 ,在这个例子中就是 opuntia.aln 和 opuntia.dnd ,但是你可以覆盖这个设置或者明确指定 :
>>> from Bio.Align.Applications import ClustalwCommandline
>>> cline = ClustalwCommandline("clustalw2", infile="opuntia.fasta")
>>> print cline
clustalw2 -infile=opuntia.fasta
注意,我们提供的可执行程序名字是 clustalw2 ,以表明我们安装的是版本 2,它与版本 1的文件名( clustalw ,默认值)不同。幸运的是 ,这两个版本都支持相同的命令行参数(并且 ,事实上它们的意义应当也是相同的 )。
你可能会发现,即使你已经安装咯ClustalW ,上面的命令还是不起作用–你可能会看到这样一个错误消息“command not found”(没有找到命令) (尤其是在 Windows 上)。这表示ClustalW 可执行程序不在你的PATH (一个环境变量 ,其中是要在其中搜索的目录的列表 ) 中 。你可以 :更新你的PATH ,以 包含你安装ClustalW 工具的位置(具体怎么做取决于你的操作系统);或者简单地输入这个工具的完整的路径。例如 :
>>> import os
>>> from Bio.Align.Applications import ClustalwCommandline
>>> clustalw_exe = r"C:Program Filesnew clustalclustalw2.exe"
>>> clustalw_cline = ClustalwCommandline(clustalw_exe, infile="opuntia.fasta")
>>> assert os.path.isfile(clustalw_exe), "Clustal W executable missing"
>>> stdout, stderr = clustalw_cline()
记住,在Python 中,字符串 n 和 t 默认会 被解释成一个换行符和一个制表符–所以我们放咯一个“r”在开头,让它成为一个原始字符串,不要像破折号前面说的那样解释。在指定一个Windows 风格的文件名时 ,这样做比较好。
最后一行要求Biopython 的版本大于或等于1.55,以通过我们的包装器对象来运行这个命令行工具 。这个包装器在内部使用 subprocess 模块 ,它现在是在Python 里运行另一个程序的首选方式 。它代替咯以前的方式 ,比如说 os.system() 和 os.popen* 函数。
好咯,现在可以了解了解命令行工具是如何 “工作”的咯。当你在命令行运行一个工具的时候 ,它通常会直接将文字输出到屏幕上 。这种文字可以捕获或者重定向 ,使用两个叫做标准输出 (普通结果) 和标准错误 (错误消息和调试消息)的“管道”就能做到。另外还有标准输入,它是那些 被提供给这个工具的文字。这些名字的缩写是stdin 、stdout 和stderr。当工具运行结束后,会产生一个返回值(一个整数 ),通常会用 0来表示成功。
当你使用Biopython 包装器像例子中这样来运行命令行工具时,它会等待那个工具结束 ,再检查它的返回值。如果返回 值不是0(表示有错误发生),那么就会抛出一个异常。接下来包装器会返回 2个字符串,stdout和stderr。
对于ClustalW 来说,当它是在命令行运行的时候 ,所有的重要的输出信息 都会直接写入到输出文件中。在你等待的时候 (通过stdout 或者stderr)输出到屏幕上的所有东西都是枯燥的,可以忽略(假设它是正常工作的)。
我们关心的是那2个输出文件:比对信息和导向树。我们不告诉ClustalW 要用什么做文件名 ,但它会按照默认情况根据输入文件来取名 。在这个例子中,输出应当是在文件 opuntia.aln 中 。现在你应该已经知道如何使用 Bio.AlignIO 来读取比对信息咯 :
>>> from Bio import AlignIO
>>> align = AlignIO.read("opuntia.aln", "clustal")
>>> print align
SingleLetterAlphabet() alignment with 7 rows and 906 columns
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF191
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF191
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF191
TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF191
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF191
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF191
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273291|gb|AF191665.1|AF191
假如你感兴趣的话(这是一个支线剧情),ClustalW 创建的 opuntia.dnd 文件就是一个标准的Newick 树文件 ,可以 被 Bio.Phylo 处理:
>>> from Bio import Phylo
>>> tree = Phylo.read("opuntia.dnd", "newick")
>>> Phylo.draw_ascii(tree)
_______________ gi|6273291|gb|AF191665.1|AF191665
__________________________|
| | ______ gi|6273290|gb|AF191664.1|AF191664
| |__|
| |_____ gi|6273289|gb|AF191663.1|AF191663
|
_|_________________ gi|6273287|gb|AF191661.1|AF191661
|
|__________ gi|6273286|gb|AF191660.1|AF191660
|
| __ gi|6273285|gb|AF191659.1|AF191659
|___|
| gi|6273284|gb|AF191658.1|AF191658
第12 章里面更深入地说明咯Biopython’s 对系统发生(phylogenetic)树的支持。
HxLauncher: Launch Android applications by voice commands