| 
1
 | 
     1 #!/usr/bin/env python
 | 
| 
 | 
     2 
 | 
| 
 | 
     3 """
 | 
| 
 | 
     4 Wrapper that executes a program with its arguments but reports standard error
 | 
| 
 | 
     5 messages only if the program exit status was not 0. This is useful to prevent
 | 
| 
 | 
     6 Galaxy to interpret that there was an error if something was printed on stderr,
 | 
| 
 | 
     7 e.g. if this was simply a warning.
 | 
| 
 | 
     8 Example: ./stderr_wrapper.py myprog arg1 -f arg2
 | 
| 
 | 
     9 Author: Florent Angly
 | 
| 
 | 
    10 """
 | 
| 
 | 
    11 
 | 
| 
 | 
    12 import sys, subprocess
 | 
| 
 | 
    13 
 | 
| 
 | 
    14 assert sys.version_info[:2] >= ( 2, 4 )
 | 
| 
 | 
    15 
 | 
| 
 | 
    16 def stop_err( msg ):
 | 
| 
 | 
    17     sys.stderr.write( "%s\n" % msg )
 | 
| 
 | 
    18     sys.exit()
 | 
| 
 | 
    19 
 | 
| 
 | 
    20 def __main__():
 | 
| 
 | 
    21     # Get command-line arguments
 | 
| 
 | 
    22     args = sys.argv
 | 
| 
 | 
    23     # Remove name of calling program, i.e. ./stderr_wrapper.py
 | 
| 
 | 
    24     args.pop(0)
 | 
| 
 | 
    25     # If there are no arguments left, we're done
 | 
| 
 | 
    26     if len(args) == 0:
 | 
| 
 | 
    27         return
 | 
| 
 | 
    28    
 | 
| 
 | 
    29     # If one needs to silence stdout 
 | 
| 
 | 
    30     #args.append( ">" )
 | 
| 
 | 
    31     #args.append( "/dev/null" )
 | 
| 
 | 
    32 
 | 
| 
 | 
    33     #cmdline = " ".join(args)
 | 
| 
 | 
    34     #print cmdline
 | 
| 
 | 
    35     try:
 | 
| 
 | 
    36         # Run program
 | 
| 
 | 
    37         proc = subprocess.Popen( args=args, shell=False, stderr=subprocess.PIPE )
 | 
| 
 | 
    38         returncode = proc.wait()
 | 
| 
 | 
    39         # Capture stderr, allowing for case where it's very large
 | 
| 
 | 
    40         stderr = ''
 | 
| 
 | 
    41         buffsize = 1048576
 | 
| 
 | 
    42         try:
 | 
| 
 | 
    43             while True:
 | 
| 
 | 
    44                 stderr += proc.stderr.read( buffsize )
 | 
| 
 | 
    45                 if not stderr or len( stderr ) % buffsize != 0:
 | 
| 
 | 
    46                     break
 | 
| 
 | 
    47         except OverflowError:
 | 
| 
 | 
    48             pass
 | 
| 
 | 
    49         # Running Grinder failed: write error message to stderr
 | 
| 
 | 
    50         if returncode != 0:
 | 
| 
 | 
    51             raise Exception, stderr
 | 
| 
 | 
    52     except Exception, e:
 | 
| 
 | 
    53         # Running Grinder failed: write error message to stderr
 | 
| 
 | 
    54         stop_err( 'Error: ' + str( e ) )
 | 
| 
 | 
    55 
 | 
| 
 | 
    56 
 | 
| 
 | 
    57 if __name__ == "__main__": __main__()
 |