| 5 | 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__() |