使用python子进程将文件从.sam转换为.bam

时间:2015-03-25 22:16:39

标签: python linux bash shell python-2.7

我想首先说任何帮助都非常感谢。我是Python和脚本的新手。我正在尝试使用一个名为samtools view的程序将文件从.sam转换为.bam我需要能够执行这个BASH命令在Python中执行的操作:

samtools view -bS aln.sam > aln.bam   

我理解BASH命令就像| > <使用Python中的子进程stdin,stdout和stderr完成。我尝试了一些不同的方法,仍然无法正确转换我的BASH脚本。我试过了:

cmd = subprocess.call(["samtools view","-bS"], stdin=open(aln.sam,'r'), stdout=open(aln.bam,'w'), shell=True)

from subprocess import Popen

with open(SAMPLE+ "."+ TARGET+ ".sam",'wb',0) as input_file:
    with open(SAMPLE+ "."+ TARGET+ ".bam",'wb',0) as output_file: 
        cmd = Popen([Dir+ "samtools-1.1/samtools view",'-bS'],
            stdin=(input_file), stdout=(output_file), shell=True) 
在Python中

我仍然没有获得将.sam转换为.bam文件的samtools。我究竟做错了什么?

2 个答案:

答案 0 :(得分:2)

Abukamel是对的,但如果你(或其他人)想知道你的具体例子......

你第一次尝试并不是太远了,只是一些小项目:

  1. 文件名应在引号中
  2. samtools从命名输入文件读取,而不是从stdin
  3. 读取
  4. 你不需要" shell = True"因为你没有使用像重定向那样的shell技巧
  5. 所以你可以这样做:

    import subprocess
    subprocess.call(["samtools", "view", "-bS", "aln.sam"],
                    stdout=open('aln.bam','w'))
    

    您的第二个示例或多或少存在相同的问题,因此需要更改为:

    from subprocess import Popen
    with open('aln.bam', 'wb',0) as output_file: 
        cmd = Popen(["samtools", "view",'-bS','aln.sam'],
                    stdout=(output_file))
    

答案 1 :(得分:0)

您可以通过kwarg'hell = True'

将执行传递给shell

subprocess.call('samtools view -bS aln.sam > aln.bam', shell=True)