"""Execute files of Python code."""

import imp, os, sys

def run_python_file(filename, args):
    """Run a python source file as if it were the main program on the python
    command line.
    
    `filename` is the path to the file to execute, must be a .py file.
    `args` is the argument array to present as sys.argv.
    
    """
    # Most code that does this does it in a way that leaves __main__ or __file__
    # with the wrong values.  Importing the code as __main__ gets all of this
    # right automatically.
    #
    # One difference from python.exe: if I run foo.py from the command line, it
    # always uses foo.py.  With this code, it might find foo.pyc instead.
    
    sys.argv = args
    sys.path[0] = os.path.dirname(filename)

    try:
        src = open(filename)
        imp.load_module('__main__', src, filename, (".py", "r", imp.PY_SOURCE))
    finally:
        src.close()

"""Execute files of Python code."""

import imp, os, sys

def run_python_file(filename, args):
    """Run a python source file as if it were the main program on the python
    command line.
    
    `filename` is the path to the file to execute, must be a .py file.
    `args` is the argument array to present as sys.argv.
    
    """
    # Most code that does this does it in a way that leaves __main__ or __file__
    # with the wrong values.  Importing the code as __main__ gets all of this
    # right automatically.
    #
    # One difference from python.exe: if I run foo.py from the command line, it
    # always uses foo.py.  With this code, it might find foo.pyc instead.
    
    sys.argv = args
    sys.path[0] = os.path.dirname(filename)

    src = open(filename)
    try:
        imp.load_module('__main__', src, filename, (".py", "r", imp.PY_SOURCE))
    finally:
        src.close()

Move the open outside the try, since the finally is only needed once the file is successfully opened.
Move the open outside the try, since the finally is only needed once the file is successfully opened.
