[Biopython-dev] subprocess and calling application wrappers
Peter
biopython at maubp.freeserve.co.uk
Wed Jun 2 11:36:46 UTC 2010
On Tue, Jun 1, 2010 at 4:15 PM, Peter <biopython at maubp.freeserve.co.uk> wrote:
> On Tue, Jun 1, 2010 at 2:23 PM, Brad Chapman <chapmanb at 50mail.com> wrote:
>> I'd suggest having an option to not capture stdout and stderr, which
>> would help users avoid those cases where a program spews a lot to
>> stdout and it's unwieldy to capture and stick it into a string.
>
> We need to avoid any risk of deadlocks, so I guess the safe
> implementation here would be call subprocess with stdout and
> stderr sent to dev null.
How does this look? Tested on Mac and Windows:
http://github.com/peterjc/biopython/tree/app-exec2
Example usage without capturing the output:
from Bio.Emboss.Applications import WaterCommandline
water_cmd = WaterCommandline(gapopen=10, gapextend=0.5, stdout=True,
asequence="a.fasta", bsequence="b.fasta")
print "About to run:\n%s" % water_cmd
return_code = water_cmd()
print "Return code: %i" % return_code
Example usage with stdout and stderr capture:
from Bio.Emboss.Applications import WaterCommandline
water_cmd = WaterCommandline(gapopen=10, gapextend=0.5, stdout=True,
asequence="a.fasta", bsequence="b.fasta")
print "About to run:\n%s" % water_cmd
stdout, stderr, return_code = water_cmd(capture=True)
print "Return code: %i" % return_code
print "Tool output:\n%s" % stdout
Note in this implementation it either returns an integer error level
(the default) or a tuple of stdout, stderr and the error level return
code. If we opt for adding methods rather than using __call__
these could be different methods instead.
Another potentially useful option would be to copy the
subprocess.check_call() function in Python 2.5+ which verifies
the return code (error level) is zero and raises an exception if not
(probably only sensible if not capturing the output?). Maybe this
could even be the default behaviour?
[I would prefer to keep the interface as simple as possible though,
less options is better! KISS principle.]
Peter
More information about the Biopython-dev
mailing list