Jacob B
Jacob B

Reputation: 23

Converting a file from .sam to .bam using python subprocess

I would like to start out by saying any help is greatly appreciated. I'm new to Python and scripting in general. I am trying to use a program called samtools view to convert a file from .sam to a .bam I need to be able do what this BASH command is doing in Python:

samtools view -bS aln.sam > aln.bam   

I understand that BASH commands like | > < are done using the subprocess stdin, stdout and stderr in Python. I have tried a few different methods and still can't get my BASH script converted correctly. I have tried:

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

and

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) 

in Python and am still not getting samtools to convert a .sam to a .bam file. What am I doing wrong?

Upvotes: 2

Views: 1521

Answers (2)

bgstech
bgstech

Reputation: 674

Abukamel is right, but in case you (or others) are wondering about your specific examples....

You're not too far off with your first attempt, just a few minor items:

  1. Filenames should be in quotes
  2. samtools reads from a named input file, not from stdin
  3. You don't need "shell=True" since you're not using shell tricks like redirection

So you can do:

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

Your second example has more or less the same issues, so would need to be changed to something like:

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

Upvotes: 3

Abukamel
Abukamel

Reputation: 21

You can pass execution to the shell by kwarg 'shell=True'

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

Upvotes: 0

Related Questions